如何使用try和catch捕获c#中的所有异常?

时间:2012-10-16 09:46:21

标签: c#

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

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

或者应该是

try {
code....
}
catch {}

7 个答案:

答案 0 :(得分:50)

这两种方法都会捕获所有异常。两个代码示例之间没有显着差异,除了第一个代码示例将生成编译器警告,因为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;而不是throw ex;重新抛出异常。

答案 1 :(得分:3)

请注意,除了所有其他评论之外,还有一些细微差别,为了完整起见,这里应该提到这一点!

使用空catch子句,当程序集标记为" RuntimeCompatibility(WrapNonExceptionThrows = false)"时,可以捕获非CLSCompliant异常。 (自CLR2起默认为true)。 [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?

答案 2 :(得分:1)

两者都很好,但只有第一个允许你检查Exception本身。

两者都吞下Exception,你应该只捕获例外来做一些有意义的事情。隐藏问题有意义!

答案 3 :(得分:1)

我捕获所有异常并将其存储在数据库中,因此可以轻松纠正错误 - 存储页面,地点,日期等

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();
}

答案 4 :(得分:1)

onToBeDeletedChanged

答案 5 :(得分:0)

两种方式都是正确的 如果你需要在catch块中使用异常对象,那么你应该使用

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

并且在catch块中使用ex。

无论如何,对于Exception类而言,并不总是一个好习惯,这是一个更为具体的例外 - 这是一个你可以期待的例外。

答案 6 :(得分:-1)

试 {

.. .. ..

}

catch(Exception ex) {

.. .. ..

} Exception ex表示所有例外情况。