【问题标题】:To throw or not to throw an exception in C# [duplicate]在C#中抛出或不抛出异常[重复]
【发布时间】:2012-02-22 12:42:44
【问题描述】:

可能重复:
Why catch and rethrow Exception in C#?

我一直在网上搜寻这个问题的答案——两者之间有什么关系?

try
{
    //Do Something
}
catch
{
    throw;
}

try
{
    //Do Something
}
catch
{
}

try
{
    //Do Something
}
catch (Exception Ex)
{
    //Do something with Exception Ex
}

【问题讨论】:

  • 你浏览过这个页面吗? msdn.microsoft.com/en-us/library/0yd65esw.aspx
  • Eric Lippert 给出了一些关于 C# 中异常处理的指南:blogs.msdn.com/b/ericlippert/archive/2008/09/10/…
  • +1 在 Eric 的博客文章上,这是一个很好的阅读。
  • 但它并没有用外行的术语来解释事情......我的意思是对于初学者来说,'rethrow' 是什么意思?扔给谁?无论如何感谢您的解释
  • @ElianEbbing:我不明白 Eric Lippert 的指导方针如何被归类为好的。他甚至没有提到“抛出”异常的想法,这个 SO 问题主要是关于这个的。

标签: c# try-catch throw


【解决方案1】:

catch --> throw 实际上只会抛出您的错误,因此您必须在其他地方捕获它。如果您想先捕获某些内容,然后将错误抛出到上面的其他方法,这将很有用。

例子:

try
{
    // do something
}
catch
{
    Console.WriteLine("Something went wrong, and you'll know it");
    throw;
}

// won't get here anymore, the exception was thrown.

虽然 try --> catch 只会让你忽略错误。

try
{
    // do something
}
catch
{
    Console.WriteLine("Something went wrong, and you won't know it.");
}

// continuing happily

【讨论】:

  • 值得注意的是,在不设置内部异常的情况下重新抛出将有效地吞下捕获的表达式并隐藏完整的堆栈跟踪。
  • 基本上......这个想法是让代码安全失败......(即出错时崩溃)
  • @ChrisTrombley 使用单词throw; 将据我所知保留堆栈跟踪。使用throw e; 隐藏堆栈跟踪。
【解决方案2】:

第一个rethrows 异常向上堆栈并保留堆栈跟踪。

第二个吞下(隐藏)异常。

第三个可能也吞下了异常,但这取决于(//做某事)做什么。

【讨论】:

    【解决方案3】:

    第一个重新抛出捕获的相同异常。第二个吞下异常,就好像它从未发生过一样。所以这取决于你需要什么。

    请注意存在这两者之间的区别:

    try
    {
        //Do Something
    }
    catch (Exception Ex)
    {
        //re-throws the same exception that was caught
        throw;
    }
    
    try
    {
        //Do Something
    }
    catch (Exception Ex)
    {
        //throws a _new_ exception containing Ex
        throw Ex;
    }
    

    【讨论】:

    • 应该注意第一个例子确实包含了旧异常的堆栈跟踪,而后者没有。
    【解决方案4】:

    首先,您只是重新抛出异常。在这种情况下你不需要 try/catch,因为你没有对捕获的异常做任何事情。

    在第二个中,您正在吞噬所有异常。这是非常危险的。永远不要这样做。它永远不会正确。

    最后,您没有向我们提供足够详细的信息。你正在捕捉异常,你可能会用它做点什么。你可以重新投掷,你可以吞下。你还没有告诉我们。

    【讨论】:

    • 重新抛出异常(示例 1)与不执行任何 try catch 并允许堆栈上的其他异常处理程序处理异常有什么区别?
    【解决方案5】:

    在第一个块中,第一个块的处理程序内部再次引发异常。这意味着它可以被外部尝试/捕获范围块拾取。第二个块“吃掉”了catch块中的异常,程序执行完catch块中的代码就可以继续正常执行了。

    【讨论】:

      【解决方案6】:

      在第一种情况下,异常被重新抛出给调用者。这个版本是没​​有意义的,因为你对异常什么都不做,但实际上你可能会做一些事情,然后将异常抛出给调用者。例如在过滤异常时也很有用

      try
      {
         //do somethign
      }
      catch(Exception1)
      {
          throw;
      }
      catch
      {
         //do something
      }
      

      第二个是你永远不应该做的事情。您正在覆盖一个异常,并使得在您的应用程序中捕获最终的错误变得更加困难。您要么需要以有意义的方式处理异常,要么让它破坏程序(或让调用者处理它)

      第三个例子是简单的异常处理。确保不要将其用作 if/else(流控制)的一种形式

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        • 2013-03-23
        • 1970-01-01
        • 2013-03-07
        • 1970-01-01
        相关资源
        最近更新 更多