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

如何使用try-and-catch捕获c#中的所有异常?,c#,exception,C#,Exception,我想写一些try-and-catch来捕获任何类型或异常,这段代码足够了吗(在Java中就是这样做的) 还是应该如此 try { code.... } catch {} 两种方法都将捕获所有异常。这两个代码示例之间没有显著差异,只是第一个示例将生成编译器警告,因为ex已声明但未使用 但请注意,有些异常是特殊的,将自动重新调用 ThreadAbortException是一个可以捕获的特殊异常,但它将在catch块末尾自动再次引发 正如评论中提到的,捕获并忽略所有异常通常是一个非常糟糕的主意。

我想写一些try-and-catch来捕获任何类型或异常,这段代码足够了吗(在Java中就是这样做的)

还是应该如此

try {
code....
}
catch {}

两种方法都将捕获所有异常。这两个代码示例之间没有显著差异,只是第一个示例将生成编译器警告,因为
ex
已声明但未使用

但请注意,有些异常是特殊的,将自动重新调用

ThreadAbortException
是一个可以捕获的特殊异常,但它将在catch块末尾自动再次引发


正如评论中提到的,捕获并忽略所有异常通常是一个非常糟糕的主意。通常,您希望执行以下操作之一:

  • 捕获并忽略一个您知道不是致命的特定异常

    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重新抛出异常和非
抛出ex

两者都可以,但只有第一个允许您检查异常本身

两者都接受异常,您应该只捕获异常来做有意义的事情。隐藏问题是没有意义的

两种方法都是正确的

如果需要对catch块中的Exception对象执行某些操作,那么应该使用

try {
    // code....
}
catch (Exception ex){}
然后在catch块中使用
ex


无论如何,捕获Exception类并不总是一个好的实践,捕获更具体的异常是一个更好的实践——一个您期望的异常。

注意,除了所有其他注释之外,还有一个小的差异,为了完整性,这里应该提到它

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

[1]

[2]


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

Exception ex表示所有异常。

afaik和afaik在C语言中都可以很好地工作,您应该以一种知道可能抛出哪些异常的方式编写代码,并相应地处理每个异常。覆盖捕获所有异常是一种不好的做法。C#不能让你声明他们的方法抛出的异常,这就避免了开发人员必须编写捕获块或在调用这些方法的方法中附加抛出,我认为这是一个很大的负面影响,因为你永远无法理解你调用的方法可能会给你带来什么。这使得您有时编写catch(){}块时,好像有什么地方出了问题,您希望将其退出,等等。当您调用另一个人api时,您永远不知道C#中可能会抛出什么,所以有时useful@SimonWhitehead这是我的观点,它不是一成不变的,而是由作者来记录的。另外,这只是评论,我希望看到它更紧密地融入到实际的语言中。有时很有用,但有时当你突然遇到异常时,你会发现,这是因为你没有进入用户的在线api并阅读他们的“备注”,看到异常可能会被抛出,例如,这是一个我最近在添加相同文件时发现的问题,因为有人抱怨“谷歌很容易”,这个问题是Google now上的第一个结果。但不幸的是,在发布模式下,它不会捕获所有异常:/Muflix您能详细说明一下为什么catch{}不会在发布模式下捕获所有异常吗[of?]?值得注意的是,您可以调用Thread.ResetAbort来取消中止请求,而不重新显示异常代码仅答案不是好答案,请尝试添加几行代码来解释问题所在以及代码如何解决问题
catch (Exception e)
{
    // Something unexpected went wrong.
    Log(e);
    // Maybe it is also necessary to terminate / restart the application.
}
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    }

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

..
..
..

}

catch(Exception ex)
{

..
..
..

}