60

あらゆるタイプまたは例外をキャッチする try と catch を書きたいのですが、このコードで十分ですか (Java で行う方法です)。

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

それともそうあるべきか

try {
code....
}
catch {}

?

4

7 に答える 7

77

どちらの方法でも、すべての例外がキャッチされます。宣言されているが使用されていないため、最初のコード例ではコンパイラの警告が生成されることを除いて、2 つのコード例に大きな違いはありexません。

ただし、一部の例外は特別であり、自動的に再スローされることに注意してください。

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

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;最後のケースでは、 and notを使用して例外が再スローされることに注意してくださいthrow ex;

于 2012-10-16T09:48:07.190 に答える
4
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        throw new NotImplementedException();
    }
于 2016-09-27T08:15:18.303 に答える
3

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

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
}

保管

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();
}
于 2016-07-21T11:36:27.297 に答える
2

どちらも問題ありませんが、例外自体を検査できるのは最初のものだけです。

どちらも例外を飲み込むため、意味のあることを行うためにのみ例外をキャッチする必要があります。問題を隠しても意味がない

于 2012-10-16T09:48:45.067 に答える
0

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

catch ブロックの Exception オブジェクトで何かをする必要がある場合は、使用する必要があります

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

そしてex、catch ブロックで使用します。

いずれにせよ、Exception クラスをキャッチすることが必ずしも良い方法とは限りません。より具体的な例外 (予期される例外) をキャッチすることをお勧めします。

于 2012-10-16T09:49:13.047 に答える