gpt4 book ai didi

c# - C# 中的 3 个 catch block 变体( 'Catch' 、 'Catch (Exception)' 和 'Catch(Exception e)' )有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 04:31:48 29 4
gpt4 key购买 nike

在 C# 中,'Catch'、'Catch (Exception)' 和 'Catch(Exception e)' 之间有什么区别?

MSDN article on try-catch在其示例中使用了其中的 2 个,但没有解释使用目的的差异。

try
{}
catch
{}

try
{}
catch (Exception)
{}

try
{}
catch(Exception e)
{}

它们有何不同?哪些捕获所有异常,哪些捕获特定异常?

最佳答案

还没有人提到这个问题的历史方面。

在 .NET 中,抛出不是从 Exception 派生的对象是合法的。 (这在 C# 中是不合法的,但在其他一些托管语言中是合法的。)许多人不知道这个事实,但它是合法的。因为那是 crazy,在 .NET 2.0 中默认值被改变了:如果你试图抛出一些不是异常的东西,那么它会自动包装在 RuntimeWrappedException 类中,这显然一个异常(exception)。然后抛出该对象。

由于这种奇怪的情况,在 C# 1.0 中,通常会看到同时执行这两种操作的代码:

try
{ do something }
catch(Exception)
{ handle the exception }
catch
{ handle the thrown non-exception }

事实上,存在安全性和正确性问题;在某些情况下,出于安全原因,您必须捕获任何抛出的东西(可能会重新抛出它)并且人们会合理地认为 catch(Exception) 捕获了所有东西,但它没有。

幸运的是,自 .NET 2.0 以来,事情变得更加明智;您可以依靠 catch {}catch(Exception) {}catch(Exception ex) {} 来捕获您需要的一切到。

最后:如果出于某种疯狂的原因你想打开 C# 1.0 行为,你可以把

[assembly:System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows = false)]

在你的程序中。

关于c# - C# 中的 3 个 catch block 变体( 'Catch' 、 'Catch (Exception)' 和 'Catch(Exception e)' )有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073834/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com