60

我想写一些 try and catch 来捕获任何类型或异常,这段代码是否足够(这就是 Java 中的方法)?

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

或者应该是

try {
code....
}
catch {}

?

4

7 回答 7

77

两种方法都会捕获所有异常。您的两个代码示例之间没有显着差异,除了第一个将生成编译器警告,因为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 回答
7

请注意,除了所有其他注释之外,还有一个小的差异,为了完整起见,应该在这里提及!

当程序集标记为“RuntimeCompatibility(WrapNonExceptionThrows = false)”(自 CLR2 以来默认为 true)时,使用空的 catch 子句可以捕获非 CLSCompliant 异常。[1][2][3]

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

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

[3] CLR 会同时处理符合 CLS 和不符合 CLS 的异常吗?

于 2013-09-24T08:11:11.867 回答
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 回答
-2
try
{

..
..
..

}

catch(Exception ex)
{

..
..
..

}

Exception ex 表示所有异常。

于 2017-06-18T00:14:54.507 回答