none
画面上にあるコントロールの例外処理について RRS feed

  • 質問

  • aspxに配置されたコントロールでデータベース処理に例外が発生した場合、
    ログを出力したいのですが、どのように行えばよいのでしょうか

    例えば、SqlDataSourceで実行するSQL処理に例外が発生した場合に、
    ログを出力させたいのですが、どこにコーティングを行えばよいのでしょうか。

    また、GridViewでデータの編集等を行ったときに、例外が発生した場合も、
    同様にログを出力させたいのですが、方法が分からずに困っています。

    どなたかご存知の方がおられたら教えてください。
    よろしくお願いします。

    2006年12月13日 0:00

回答

  • Hidegi さん、こんにちは。

     Hidegi さんからの引用
    例えば、SqlDataSourceで実行するSQL処理に例外が発生した場合に、
    ログを出力させたいのですが、どこにコーティングを行えばよいのでしょうか。
    また、GridViewでデータの編集等を行ったときに、例外が発生した場合も、
    同様にログを出力させたいのですが、方法が分からずに困っています。

    Application_Error イベントにログ出力の仕組みを入れておけば良いと思います。

    2006年12月13日 1:09
  • 以下が参考になると思います。ただ、以下の例ではlock(VBだとSyncLock)をしていないので、lockをしてスレッドセーフにして下さい。

    [ASP.NET]アプリケーション内で発生したエラー情報をロギングするには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/168asperrlog/asperrlog.html

    2006年12月13日 1:46
    モデレータ
  • > また、GridViewでデータの編集等を行ったときに、例外が発生した場合も、
    > 同様にログを出力させたいのですが、方法が分からずに困っています。

    RowUpdatedイベントを利用するのがよいのではないでしょうか。
    引数から、e.Exceptionで例外を取り出すことができますし、例外に対して独自に処理して次の操作に続けたいときはe.ExceptionHandledにtrueを設定してあげればいいようになっています。

     

    2006年12月13日 2:07

すべての返信

  • Hidegi さん、こんにちは。

     Hidegi さんからの引用
    例えば、SqlDataSourceで実行するSQL処理に例外が発生した場合に、
    ログを出力させたいのですが、どこにコーティングを行えばよいのでしょうか。
    また、GridViewでデータの編集等を行ったときに、例外が発生した場合も、
    同様にログを出力させたいのですが、方法が分からずに困っています。

    Application_Error イベントにログ出力の仕組みを入れておけば良いと思います。

    2006年12月13日 1:09
  • 以下が参考になると思います。ただ、以下の例ではlock(VBだとSyncLock)をしていないので、lockをしてスレッドセーフにして下さい。

    [ASP.NET]アプリケーション内で発生したエラー情報をロギングするには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/168asperrlog/asperrlog.html

    2006年12月13日 1:46
    モデレータ
  • > また、GridViewでデータの編集等を行ったときに、例外が発生した場合も、
    > 同様にログを出力させたいのですが、方法が分からずに困っています。

    RowUpdatedイベントを利用するのがよいのではないでしょうか。
    引数から、e.Exceptionで例外を取り出すことができますし、例外に対して独自に処理して次の操作に続けたいときはe.ExceptionHandledにtrueを設定してあげればいいようになっています。

     

    2006年12月13日 2:07
  • みなさま、返信をありがとうございます。

    asaxファイルのApplication_Error と
    GridViewのRowUpdatedイベントにて、画面コントロールの例外を
    記述することができました。

    ありがとうございました。

    2007年1月11日 6:06
  • >以下が参考になると思います。ただ、以下の例ではlock(VBだとSyncLock)をしていないので、lockをしてスレッドセーフにして下さい。

    念のため注意点です。
    もし例のようにファイルに直接書き出すのなら、Mutex辺りを使って排他するほうが良いです。

    あと、やってはいけないこと…
    lock (this)
    {
    }


    SyncLock  Me
    End SyncLock 

    ※thisをロックするな、という話とはまた別で、インスタンスレベルでロックしても意味がないという話です。

    まあ、本当はもともとスレッドセーフに作成されているログ出力機能を使用するべきですけどね。

    2007年1月12日 12:08
  •  なちゃ さんからの引用

    もし例のようにファイルに直接書き出すのなら、Mutex辺りを使って排他するほうが良いです。

    なるほどそうですね。IIS6.0にはワーカープロセス分離モードがあるので、Mutexの方が良いということですね?
    2007年1月12日 15:23
    モデレータ
  • >なるほどそうですね。IIS6.0にはワーカープロセス分離モードがあるので、Mutexの方が良いということですね?

    重点は2つあって、

    1)ワーカープロセスなどが複数同時に動作することがあり得る
    これは、Webガーデン等、複数プロセスが動作するように設定した場合や、
    たとえそうでなくとも、ワーカープロセスのリサイクル時に一時的に同時に
    動作することがあり得るためです。
    プロセスのリサイクル時は、ログ出力などを行う可能性が高いタイミングです。

    2)Global.asaxに関する誤解を招くあるいは誤解している人が多い気がする
    Global.asaxのインスタンスは、各リクエストの処理毎に独立しています。
    プールされたインスタンスの再利用は行われますが、同時処理している
    インスタンスは全て独立しています。
    したがって、Global.asaxのインスタンス単位でロックをかけても、何ら排他
    制御にはなりません。

    まあ、実際にログ出力などを行う場合は、Mutex等で排他するか、あるいは
    最初に出力先ファイルを排他オープンして、失敗したらファイル名を変えるなど
    やりかたはいろいろです。

    いいたかったことは、Global.asaxでlockを行う、というのは間違った処理を
    行う方向に誘導してしまう可能性があるので、注意が必要ということです。

     

     

    2007年1月12日 15:45
  •  なちゃ さんからの引用

    たとえそうでなくとも、ワーカープロセスのリサイクル時に一時的に同時に
    動作することがあり得るためです。
    プロセスのリサイクル時は、ログ出力などを行う可能性が高いタイミングです。

    なるほど。ここは特に勉強になりました。

     なちゃ さんからの引用

    2)Global.asaxに関する誤解を招くあるいは誤解している人が多い気がする
    Global.asaxのインスタンスは、各リクエストの処理毎に独立しています。
    プールされたインスタンスの再利用は行われますが、同時処理している
    インスタンスは全て独立しています。
    したがって、Global.asaxのインスタンス単位でロックをかけても、何ら排他
    制御にはなりません。

    いわゆるASP.NETのSingleCallモデルに関係してますね。

     なちゃ さんからの引用

    いいたかったことは、Global.asaxでlockを行う、というのは間違った処理を
    行う方向に誘導してしまう可能性があるので、注意が必要ということです。

    確かにその通りだと思います。フォロー、ありがとうございました。

    2007年1月12日 16:22
    モデレータ