C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.89819 の関連記事表示

<< 0 >>
■89819  using のインスタンス生成で例外が発生する場合の処理
□投稿者/ dogatana -(2019/01/05(Sat) 12:25:02)

    分類:[C#] 

    こんにちは。

    CSVファイルを書き込む処理を実装しています。

    よくあるように、using を利用しているのですが、該当ファイルが既にExcel開かれていると
    StreamWriter のインスタンス生成で例外が発生します。
    この例外の処理のため using ブロックを try - catch で囲んだのですが、try - catch は
    比較的限定された範囲で使用するのが通例と聞いており、このように usingブロックを囲むと
    範囲が広すぎるように思え、気持ち悪さがあります。

    この例のように、using のインスタンス生成で例外が発生する場合は、using を使わず
    try - catch - finally で実装するのが自然でしょうか。

    ご教示いただければ幸いです。

    static public string ExportCsv(string filename, IEnumerable<EventLog> list)
    {
    try {
    var encoding = Encoding.GetEncoding("Shift_JIS");
    using (var sw = new StreamWriter(filename, false, encoding)) {
    sw.WriteLine(EventLog.Title);
    foreach (var item in list) {
    sw.WriteLine(item.ToCsv());
    }
    }
    return "";
    }
    catch (Exception e) {
    return e.Message;
    }
    }
親記事 /過去ログ155より / 関連記事表示
削除チェック/

■89820  Re[1]: using のインスタンス生成で例外が発生する場合の処理
□投稿者/ WebSurfer -(2019/01/05(Sat) 13:55:35)
    No89819 (dogatana さん) に返信

    以下の記事によると、

    NETの例外処理 Part.1
    https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

    ***Quote***
    try-catch 命令を書く場合には、業務エラーなどに変換したくない例外を、間違って捕捉しないよう
    にしなければなりません。具体的には、以下のようなコードは絶対に書いてはいけません。

    ・複数行のコードをまとめて try-catch で囲む。
    ・一般例外(Exception クラス)を catch する。
    ・catch したあと何もしない。
    ***Unquote***

    ・・・ということですので、それに従えば質問者さんが書いたコードは「絶対に書いてはいけません」
    という例になってしまいます。

    どうすべきかは紹介した記事に書いてありますので興味があれば読んでみてください。

    Part. 2 も紹介しておきます。

    .NETの例外処理 Part.2
    https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/



    紹介した記事に書いてあることをまとめると、以下の通りになると思っています。

    (1) 予測可能で正しい業務フローに戻すことができる「業務エラー」(例:ユーザーの入力間違い)と、
      予測できないもしくは予測はできても何の対応もできない「例外」(例:DB サーバーダウン)を
      区別して対処。

    (2) 「例外」はランタイムに拾わせてアプリケーションを停止させる。

    (3) よほどのことがない限り try-catch は書かない。

    (4) キャッチせざるを得ない場合でも Execption はキャッチしない。

    (5) 間違って補足してしまった例外は throw する。(注:catch ブロックでキャッチした例外を throw
      するとスタックトレースが途切れるので単に throw と書く)

    (6) ユーザーへの通知が必要なら、集約的例外処置を利用する。

    あと、.NET 4 からは破損状態例外は catch できなくなっているそうですが、「それでも Catch
    (Exception e) を使用するのはよくない」ということについては以下の記事を見てください。

    破損状態例外を処理する
    https://msdn.microsoft.com/ja-jp/magazine/dd419661.aspx
記事No.89819 のレス /過去ログ155より / 関連記事表示
削除チェック/

■89825  Re[2]: using のインスタンス生成で例外が発生する場合の処理
□投稿者/ dogatana -(2019/01/06(Sun) 11:00:27)
記事No.89819 のレス / END /過去ログ155より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -