DOBON.NETプログラミング道掲示板

■34138 / 1階層)  例外発生した場合に変数をcatchに渡したい
□投稿者/ 魔界の仮面弁士 大御所(1196回)-(2019/02/15(Fri) 17:51:45)
  • アイコン2019/02/15(Fri) 18:59:22 編集(投稿者)

    No34133に返信(ssdさんの記事)
    > DataTable dt = new DataTable();
    > try
    > {
    >  foreach (DataRow dr in dt.Rows)
    >  {

    行数が 0 なのでそもそもループ処理に入らないですが、
    それは本題ではないので置いといて…。



    > catch(Exception e)

    そもそも論で言えば、すべての例外を無条件に拾うことは望ましくありません。

    実行時例外で処理するしかない処理(通信エラー等)以外は捕らえるべきではないので、
    「int に変換できないような値が DataTable に混入しないようにする」か、
    「int に変換できる場合にのみキャストする」などして、
    例外を発生しないコードに書き換えることも検討してみてください。


    例外処理のための参考資料を紹介しておきます。
    https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/
    https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/
    https://blogs.msdn.microsoft.com/nakama/2009/01/18/net-part-3/
    https://blogs.msdn.microsoft.com/nakama/2009/01/23/net-part-4/
    https://blogs.msdn.microsoft.com/nakama/2009/01/08/netjava/


    >   int iHogeOld = (int)dr["HOGE"];

    ということで、例外が発生しないようにする方法の一つとして、
     // int 以外は(DBNull など)は -999 として取り扱う
     int intHoge = dr["HOGE"] as int? ?? -9999;
    のようにするという手もあろうかと思います。



    > foreach内で型変換に失敗した場合、catch側で何が失敗したのか知りたいです。

    何らかの理由で、catch で捕らえる必要があるのだとしても、
    例外処理として「型変換」のみを取り扱いたいのであれば、
    【Exception】ではなく【InvalidCastException】を捕らえるべきかと思います。


    foreach (DataRow dr in dt.Rows)
    {
     // object[] rawData = dr.ItemArray; // 全部の列の値をまとめて取得
     object rawHoge = dr["HOGE"]; // 特定の列の値のみ取得
     try
     {
      int iHoge = (int)rawHoge; // int 型に unbox
     }
     catch (InvalidCastException)
     {
      Console.WriteLine("HOGE 列の値「{0}」を int に変換できませんでした。(型名:{1})", rawHoge, rawHoge.GetType().FullName);
      // throw;
     }
    }



    >   int iHogeOld = (int)dr["HOGE"];

    実際の値が DBNull や long であった場合、上記の処理は確かに失敗しますが、
    ここで発生しうる例外は、unbox の失敗によるものだけではないはずです。


    たとえば列名が間違っていれば、引数例外の【ArgumentException】が起きることもありますし、
    削除済み行にアクセスしようとして【DeletedRowInaccessibleException】となることもあるわけで。
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←例外発生した場合に変数をcatchに渡したい /ssd →Re[2]: 例外発生した場合に変数をcatchに渡したい /ssd
 
上記関連ツリー

Nomalアイコン 例外発生した場合に変数をcatchに渡したい / ssd (19/02/15(Fri) 10:55) #34133
Nomalアイコン Re[1]: 例外発生した場合に変数をcatchに渡したい / ひできち (19/02/15(Fri) 11:25) #34134
│└Nomalアイコン Re[2]: 例外発生した場合に変数をcatchに渡したい / ssd (19/02/15(Fri) 13:25) #34135
│  └Nomalアイコン Re[3]: 例外発生した場合に変数をcatchに渡したい / ひできち (19/02/15(Fri) 17:05) #34137
Nomalアイコン Re[1]: 例外発生した場合に変数をcatchに渡したい / まりもん (19/02/15(Fri) 14:23) #34136
│└Nomalアイコン Re[2]: 例外発生した場合に変数をcatchに渡したい / ssd (19/02/15(Fri) 18:04) #34139
│  └Nomalアイコン Re[3]: 例外発生した場合に変数をcatchに渡したい / タイガー (19/02/18(Mon) 14:40) #34141
Nomalアイコン 例外発生した場合に変数をcatchに渡したい / 魔界の仮面弁士 (19/02/15(Fri) 17:51) #34138 ←Now
  └Nomalアイコン Re[2]: 例外発生した場合に変数をcatchに渡したい / ssd (19/02/15(Fri) 18:06) #34140
    └Nomalアイコン Re[3]: 例外発生した場合に変数をcatchに渡したい / ssd (19/02/19(Tue) 09:39) #34142 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -