2012-10-16 10 views
32

私はいくつか試してみたいと思いますが、その型や例外をキャッチするには、このコードは十分です(Javaで行う方法です)?どのようにC#でtryとcatchを使用してすべての例外をキャッチするには?

try { 
code.... 
} 
catch (Exception ex){} 

それとも

try { 
code.... 
} 
catch {} 

すべきですか?

+4

なぜあなたはそれをしたいですか?あなたは、処理できる例外をキャッチする必要があります。 – Oded

+0

両方とも動作します... – pengibot

+0

これはGoogleにとって非常に簡単ではありませんか? – jgauffin

答えて

38

両方のアプローチがすべての例外をキャッチします。 exが宣言されていますが使用されていないため、コンパイラの警告が生成される点を除いて、2つのコード例には大きな違いはありません。

ただし、いくつかの例外は特別なもので、自動的に再スローされます。

ThreadAbortExceptionはキャッチ可能な特別な例外ですが、キャッチブロックの最後に自動的に再度発生します。

http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx


コメントで述べたように、通常、すべての例外をキャッチして無視する非常に悪い考えです。通常、代わりに次のいずれかを実行します。

  • 致命的ではないことがわかっている特定の例外をキャッチして無視します。

    catch (SomeSpecificException) 
    { 
        // Ignore this exception. 
    } 
    
  • すべての例外をキャッチしてログに記録します。

    catch (Exception e) 
    { 
        // Something unexpected went wrong. 
        Log(e); 
        // Maybe it is also necessary to terminate/restart the application. 
    } 
    
  • すべての例外をキャッチしてクリーンアップを行い、例外を再送信します。

    catch 
    { 
        SomeCleanUp(); 
        throw; 
    } 
    

最後の場合には例外がthrow;なくthrow ex;を使用して再スローされることに注意してください。

+0

残念ながらリリースモードでは、これはすべての例外を捕まえることはできません:/ – Muflix

+3

Muflixは、catch {}がすべての例外をキャッチしない理由を詳しく説明してくれますか?リリースモード[?]? –

1

どちらも問題ありませんが、最初のものだけでExceptionそのものを検査できます。

例外を飲み込むだけで、何か意味のあることをするために例外をキャッチする必要があります。問題を隠すことはではなく、の意味があります!あなたは

try { 
code.... 
} 
catch (Exception ex){} 

とcatchブロックでEXを使用するよりもを使用する必要がありますよりも、catchブロックで例外オブジェクトで何かを行う必要がある場合

0

どちらの方法が 正しいです。

とにかく、Exceptionクラスをcathcするのは必ずしも良い習慣ではありません。もっと具体的な例外をキャッチするのがベタープラクティスです - あなたが期待できる例外です。

3

例外はすべてExceptionに由来しているため、上記の両方が機能します。

あなたはこのかかわらずをしたいなぜ私が求めるだろう。回復可能な例外だけをキャッチする必要があります。他のすべてが、あなたのアプリケーションを恐ろしい致死的な死に至らせるものでなければなりません。おそらくアプリケーションが破損している可能性があります。他のすべてのコメントのほかに、完全を期すために、ここで言及されるべきわずかな差があること

+0

私は例外を処理したくありません。私はちょうど私のプログラムが発生した場合にクラッシュしないようにしたい... –

+0

何かが間違っていて、あなたはそれがまったく起こったことをユーザーに知らせるつもりはありませんか?... –

+4

実際に複数のユースケースがありますこの。 Webサービスから複数の(50,000以上の)リソースをバッチフェッチするとき、私は絶対にすべての可能なエラーをキャッチしたい(無効なhttpエラー、サービスのタイムアウト、サービスが500の内部サーバーエラー)、それらを記録して、続行してください。ここでのポイントは、個々のWeb呼び出しでこのジョブが失敗する可能性のあるすべての方法をまだ知っていないことです。 –

2

注意!

空のcatch句を使用すると、アセンブリに「RuntimeCompatibility(WrapNonExceptionThrows = false)」(CLR2以降にデフォルトでtrue)とマークされている場合、非CLSCompliant例外をキャッチできます。 [1] [2] [3]

[1] http://msdn.microsoft.com/en-us/library/bb264489.aspx

[2] http://blogs.msdn.com/b/pedram/archive/2007/01/07/non-cls-exceptions.aspx

[3] Will CLR handle both CLS-Complaint and non-CLS complaint exceptions?

1

Iエラーので、すべての例外をキャッチし、データベースに格納簡単に修正することができます - ページ、場所、日付などが

を保存
try 
{  
    Cart = DB.BuyOnlineCartMasters.Where(c => c.CmpyID == LoginID && c.Active == true).FirstOrDefault(); 
} 
catch (Exception e) 
{ 
    ErrorReport.StoreError("CartMinifiedPartial-Company", e); 
    -- storing the error for reference 
} 

を保存3210

public static void StoreError(string ErrorPage, Exception e) 
    { 
     try 
     { 
      eDurar.Models.db_edurarEntities1 DB = new Models.db_edurarEntities1(); 
      eDurar.Models.ErrorTable Err = new eDurar.Models.ErrorTable(); 
      Err.ErrorPage = ErrorPage; 
      if (e.Message != null) 
      { 
       Err.ErrorDetails = e.Message; 
      } 
      if (e.InnerException != null) 
      { 
       Err.InnerException = e.InnerException.Message.ToString(); 
      } 

      Err.Date = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time")); 
      DB.ErrorTables.AddObject(Err); 
      DB.SaveChanges(); 
} 
0
static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    } 

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 
+0

コードのみの回答は良い答えではありません。問題の内容とコードの修正方法を説明する行をいくつか追加してみてください – MikeT

-1

.. .. {

.. .. ..

}

キャッチ(例外EX) {

を試します..

}は例外exがすべての例外を意味 。

関連する問題