お題
asp.netのtry~catchでハメられた話
結論
try~catchも、ちゃんと設計しましょう。
環境
- asp.netで作られた年代物のサイト
- もちろんスパゲッティ
- もちろん初期開発者・担当者は居ない
- windows2008R2
- どこかのタイミングで、.net2.0系から、.net4.0系にアップしたみたい
状況
エラーでリダイレクトする場合に、発生エラーに応じて、適切なリダイレクトするようになっていたが、どうやら最近、ちゃんとリダイレクトされていないようだけど、どうなの?
調査開始
調査結果
ここで簡単に、ファイルを3つほど紹介(かなり簡略化しています。)
- main.asp.vb (メイン処理となるvb)
- check.vb (チェック処理を行うvb)
- db.vb (DBにアクセスして、データを取り出すvb)
どうやら、こいつらのリダイレクト処理が怪しい。
main.asp.vb
Class Main
Protected Sub Page_Load() Handles Me.Load
Try
If 入力チェック処理() End
KEY = Getパラメータ
DB.データ取得処理()
End if
Catch
リダイレクト(例外エラー)
End Try
End Sub
End Class
check.vb
Public Class Chk
Public Function 入力チェック処理()
Try
KEY = Getパラメータ
return チェック処理の結果
Catch
リダイレクト(パラメータエラー)
End try
End Function
End Class
db.vb
Public Class DB
Public Function データ取得(ByVal KEY As Integer)
Try
return KEYで取得したデータ
Catch
リダイレクト(DBエラー)
End try
End Function
End Class
予想
開発者は、
- KEYが想定外 -->> check.vbのtryに捕まって、リダイレクト(パラメータエラー)
- DBまわりで想定外 -->> db.vbのtryに捕まって、リダイレクト(DBエラー)
- それ以外の想定外 -->> main.asp.vbのtryに捕まって、リダイレクト(例外エラー)
のつもりで書いたのかと。
実際の挙動
全部、リダイレクト(例外エラー)
つまり、main.asp.vbから呼び出している関数内でエラーが発生した場合に、関数内のtryじゃなくて、呼び出し元のmain.asp.vbのtry~catchに捕まってしまっていたという訳。
対応
try~catchに関しては、放置!
というか、既存が凄すぎて、手が入れられない!
そのため、意図したエラーを、try~catchではなく、ちゃんと補足して、リダイレクトさせる用にしました。
本当は、他の方法もあったのかも知れないが、半ば放置されているようなサイトですがら、予算観点で・・・。