【问题标题】:How to catch all exceptions in c# using try and catch?如何使用try和catch捕获c#中的所有异常?
【发布时间】:2012-10-16 09:46:20
【问题描述】:

我想写一些 try and catch 来捕捉任何类型或异常,这段代码够用吗(Java 就是这样)?

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

应该是这样

try {
code....
}
catch {}

?

【问题讨论】:

  • afaik 在 C# 中都可以正常工作
  • 我不想处理异常。我只是希望我的程序在发生时不会崩溃......
  • C# 不会让您声明他们的方法抛出的异常,这使开发人员不必编写 catch 块或将抛出附加到调用这些方法的方法中,我认为这对您来说是一个很大的负面影响永远不会高估你调用的方法可能会反击你。这使您有时会编写 catch() {} 块,就好像出现任何问题一样,您想将其退出等。当您调用其他人的 api 时,您永远不会真正知道 C# 中可能会抛出什么,因此有时很有用
  • @SimonWhitehead 这就是我的观点,它不是一成不变的,由作者来记录它。它也只是 cmets,我希望看到它更紧密地集成到实际语言中。有时很有用,但有时会在你突然出现异常时发现你,这是因为你没有进入用户在线 api 并阅读他们的“备注”以查看可能引发异常,例如dotnetzip.herobo.com/DNZHelp/html/… 这是我最近两次添加同一个文件时发现的问题
  • 对于那些抱怨“谷歌很容易”的人,这个问题是谷歌现在的第一个结果。

标签: c# exception


【解决方案1】:

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

但请注意,有些异常是特殊的,会自动重新抛出。

ThreadAbortException 是一个可以被捕获的特殊异常,但它会在 catch 块结束时自动再次引发。

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


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

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

    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; 重新引发异常。

【讨论】:

  • 但不幸的是在发布模式下这不会捕获所有异常:/
  • Muflix 能否详细说明为什么 catch {} 不会在发布模式 [of?] 中捕获所有异常?
  • 值得注意的是,您可以调用 Thread.ResetAbort 来取消请求中止而不重新抛出异常
  • 小心。捕获所有异常捕获所有异常。诸如 System running out of memory 和 Rider 之类的东西会对此发出警告。
【解决方案2】:

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

当程序集标记为“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]Will CLR handle both CLS-compliant and non-CLS compliant exceptions?

【讨论】:

    【解决方案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();
    }
    

    【讨论】:

      【解决方案4】:
          static void Main(string[] args)
          {
              AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
          }
      
          static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
          {
              throw new NotImplementedException();
          }
      

      【讨论】:

      • 仅代码的答案不是好的答案,请尝试添加几行来解释问题所在以及您的代码如何解决它
      • 我不明白这应该如何回答这个问题。
      【解决方案5】:

      两者都很好,但只有第一个允许您检查异常本身。

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

      【讨论】:

        【解决方案6】:

        这两种方法都是正确的。

        如果你需要对 catch 块中的 Exception 对象做一些事情,那么你应该使用

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

        然后在 catch 块中使用ex

        无论如何,捕捉 Exception 类并不总是一个好习惯,捕捉一个更具体的异常是一个更好的做法 - 一个您期望的异常。

        【讨论】:

          【解决方案7】:
          try
          {
          
          ..
          ..
          ..
          
          }
          
          catch(Exception ex)
          {
          
          ..
          ..
          ..
          
          }
          

          Exception ex 表示所有异常。

          【讨论】:

            猜你喜欢
            • 2013-12-05
            • 1970-01-01
            • 2018-05-23
            • 1970-01-01
            • 1970-01-01
            • 2012-08-06
            • 1970-01-01
            • 2011-10-06
            • 2015-06-21
            相关资源
            最近更新 更多