这两个代码示例是否相同? Catch 和 Catch(例外e)具有相同的输出,如果我写投掷或投掷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;
}
}
答案 0 :(得分:52)
我认为这里有两个问题。
throw
和throw e;
有什么区别?
我认为没有充分的理由写catch (Exception e) { throw e; }
。这会丢失原始的堆栈跟踪。使用throw;
时,将保留原始堆栈跟踪。这很好,因为这意味着更容易找到错误的原因。
catch
和catch (Exception e)
有什么区别?
你的两个例子都是一样的,同样没用 - 它们只是捕获异常然后重新抛出它。一个小的区别是第一个示例将生成编译器警告。
变量'e'已声明但从未使用过
如果你在catch块中有一些实际上有用的代码,那么问这个问题更有意义。例如,您可能希望记录异常:
try
{
int value = 1 / int.Parse("0");
}
catch (Exception e)
{
LogException(e);
throw;
}
现在有必要使用第一个版本,以便您可以引用捕获的异常。
如果你的catch块实际上没有使用异常,那么你会想要使用第二个版本来避免编译器警告。
答案 1 :(得分:35)
如果我们忽略“未使用的变量”警告,那么
之间只有实用的区别catch {...}
和
catch(Exception ex) {...}
是一些非C#代码抛出非Exception
异常的时候。 C ++可以抛出 任何 。在.NET 1.1中,您 使用catch
(无(Exception ex)
)来处理这些异常异常。然而,这是有问题的 - 尤其是,你无法看到抛出的东西!因此,在.NET 2.0及更高版本中,这是默认包装的,因此即使C ++抛出一个string
- 您也将其视为Exception
子类。请注意,可以通过配置设置禁用此功能,但是:请勿执行此操作。别管它了!
已经提到了throw;
vs throw ex;
的问题,它与堆栈跟踪有关。在这两种情况下都可以使用throw
,从而保留原始堆栈跟踪。