[ ASP.NET ] パフォーマンス的にも不要な例外は避けて制御する ( DateTime.TryParse )

Pocket

例外処理のオーバーヘッドは意外と大きなものとなりますので、なるべく例外の発生を避けることがパフォーマンスの向上のためにも大切です。例外については ASP.NET に限ったことではなく Windows アプリケーションやその他の言語やフラットフォームにもいえることです。また、パフォーマンスへの影響だけではなく、汚いソースコードになる可能性も高いと思います。

スポンサーリンク
不要な例外の発生を避けるサンプルコード

文字列を日付型 ( Datetime ) に変換するコードです。DateTime.TryParse メソッドを使用してパラメータの妥当性検証を事前に確認しています。

VB.NET

    ' GET パラメータの取得
    Dim strYmd As String = Page.Request.QueryString.Get("date")
    If (strYmd Is Nothing) Then

        ' この位置で Get パラメータの存在チェックを行い、
        ' 適切なエラー処理を行う
        Return
    End If

    Dim dateYmd As DateTime
    If (DateTime.TryParse(strYmd, dateYmd) = False) Then

        ' 日付型の文字列ではないので、
        ' 適切なエラー処理を行う
        Return
    End If

    '-------------------------------
    ' 何か処理を行う
    '-------------------------------

C#

    // GET パラメータの取得
    string strYmd = Page.Request.QueryString.Get("date");
    if (strYmd == null) {

        // この位置で Get パラメータの存在チェックを行い、
        // 適切なエラー処理を行う
        return;
    }

    DateTime dateYmd;
    if (DateTime.TryParse(strYmd, dateYmd) == false) {

        // 日付型の文字列ではないので、
        // 適切なエラー処理を行う
        return;
    }

    //-------------------------------
    // 何か処理を行う
    //-------------------------------
例外の発生によってエラーを判別するコード

反例として、例外の発生によってエラー判定を行っているサンプルコードを以下に示します。例外の発生を何かの判定に使用することは避けたほうがよいでしょう。

VB.NET

    Try
        ' GET パラメータの取得
        Dim strYmd As String = Page.Request.QueryString.Get("date")
        ' DateTime 型へ変換
        ' データエラーの場合は例外が発生する
        Dim dateYmd As DateTime = DateTime.Parse(strYmd)

        '-------------------------------
        ' 何か処理を行う
        '-------------------------------

    Catch ex As Exception

        ' GET パラメータが存在しない場合や
        ' 入力形式が日付型ではない場合のエラー処理を記述する

    End Try

C#

    try {
        // GET パラメータの取得
        string strYmd  = Page.Request.QueryString.Get("date");
        // DateTime 型へ変換
        // データエラーの場合は例外が発生する
        DateTime dateYmd  = DateTime.Parse(strYmd);

        //-------------------------------
        // 何か処理を行う
        //-------------------------------

    } catch (Exception ex) {
        // GET パラメータが存在しない場合や
        // 入力形式が日付型ではない場合のエラー処理を記述する
    }
その他の注意事項

例外に関連する注意事項や検討事項を列挙します。

  • 例外は発生させないことが第一でありますが、どうしても例外は発生してしまうこともあります。例外が発生した場合には、ログなどに記録し、障害の内容や発生個所を特定できるような仕組みを準備しておくことが大切です。エラーメッセージやスタックトレース情報は最低限あったほうが良いでしょう。
  • ユーザーに例外情報をレスポンスで返すようなことはセキュリティの観点からも行うべきではありません。また、クライアントへ送信するデータ量を減らすことにもつながります。ただし、社内システムではその限りではありません。

とある社内システムにおいて例外発生時に、使い方の説明ページに遷移してみたり、メッセージに「使い方が間違っています」と出力させたことがあります。システム屋の逆切れページみないな感じです。若さってすばらしいです。

スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>