【问题标题】:Catch vs Catch (Exception e) and Throw vs Throw eCatch vs Catch (Exception e) 和 Throw vs Throw e
【发布时间】:2012-06-04 01:55:42
【问题描述】:

这两个代码示例是否相同? CatchCatch (Exception e) 有相同的输出,如果我写 ThrowThrow e 的结果也是一样的

主要:

try
{
    A();
    //B();
}
catch (Exception e)
{
    Console.WriteLine("{0} exception caught.", e);
}

代码 1:

static void A()
{
    try
    {
        int value = 1 / int.Parse("0");
    }
    catch (Exception e)
    {
        throw e;
    }
}

代码 2:

static void A()
{
    // Rethrow syntax.
    try
    {
        int value = 1 / int.Parse("0");
    }
    catch
    {
        throw;
    }
}

【问题讨论】:

  • 两者都是一样的,因为你throw
  • @MarcGravell - Marc 是的,如果他 throws e 有区别。
  • 知道了,我只是想重新标记,但我发现已经处理好了!
  • throw e 有什么意义,因为您抛出异常但缺少堆栈跟踪的有用部分
  • @JonH 已经删除了我的评论 - 误读了问题;p

标签: c# try-catch


【解决方案1】:

我认为这里有两个问题。


throwthrow e;有什么区别?

我认为没有充分的理由写catch (Exception e) { throw e; }。这会丢失原始的堆栈跟踪。当您使用 throw; 时,原始堆栈跟踪被保留。这很好,因为这意味着错误的原因更容易找到。


catchcatch (Exception e)有什么区别?

您的两个示例都相同且同样无用 - 它们只是捕获异常然后重新抛出它。一个小的区别是第一个示例将生成编译器警告。

变量“e”已声明但从未使用过

如果您的 catch 块中有一些其他代码实际上做了一些有用的事情,那么问这个问题会更有意义。例如,您可能想要记录异常:

try
{
    int value = 1 / int.Parse("0");
}
catch (Exception e)
{
    LogException(e);
    throw;
}

现在有必要使用第一个版本,以便引用捕获的异常。

如果您的 catch 块实际上没有使用异常,那么您可能希望使用第二个版本来避免编译器警告。

【讨论】:

  • 我更新了代码,我只是想知道写 Exception e / Throw e 是否有问题,因为结果是一样的..
  • @Loclip:如果您关心不丢失堆栈跟踪,并且如果您关心在编译代码时不会出现编译器警告(并且您应该关心这些事情)那么,是的,这很重要。
  • 也可以在不引入局部变量的情况下指定要捕获的异常类型(编译器抱怨从未使用过)。你就说:catch (ArithmeticException) { ... }
【解决方案2】:

如果我们忽略“未使用的变量”警告,那么只有一次实际之间存在差异

catch {...}

catch(Exception ex) {...}

当一些非 C# 代码抛出非Exception 异常时。 C++ 可以抛出任何东西。在 .NET 1.1 中,您必须使用catch(没有(Exception ex))来处理这些异常异常。然而,这是有问题的——尤其是,你看不到抛出了什么!因此,在 .NET 2.0 及更高版本中,默认情况下会包装它,因此即使 C++ 抛出 string - 您也会将其视为 Exception 子类。请注意,这可以通过配置设置禁用,但是:不要。别管它!

throw;throw ex; 的问题已经被提及,并且与堆栈跟踪有关。您可以在这两种情况下使用throw,从而保留原始堆栈跟踪。

【讨论】:

  • 出于纯粹的教育目的,您是否提供有关此配置设置的更多信息的链接?或者如果你不想在这里链接它来诱惑命运,我可以在推特上给你发私信吗?我目前无法找到有关它的更多信息。
  • 另一个实际问题 - 如果我没有 "catch(Exception ex) {...}" 那么我在调试时将不知道异常是什么。除非我弄错了,并且有办法在空的“catch{..}”语句中查看异常......
  • 这个已经有一段时间了,不过可以在监视窗口使用$exceptionstackoverflow.com/questions/15943373/…
  • 或者您可以在“本地”标签中看到它。
猜你喜欢
  • 1970-01-01
  • 2010-12-14
  • 2014-03-18
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 2020-07-26
相关资源
最近更新 更多