jor*_*dan 21 c# exception try-catch visual-studio-2010
在C#中,'Catch','Catch(Exception)'和'Catch(Exception e)'之间有什么区别?
关于try-catch的MSDN文章在其示例中使用了其中的两篇,但没有解释使用目的的差异.
try
{}
catch
{}
try
{}
catch (Exception)
{}
try
{}
catch(Exception e)
{}
Run Code Online (Sandbox Code Playgroud)
这些有何不同?哪些会捕获所有异常,哪些异常捕获?
Eri*_*ert 45
还没有人提到这个问题的历史方面.
在.NET中,抛出一个不是派生的对象是合法的Exception.(它在C#中不合法,但它在其他一些托管语言中.)许多人不知道这个事实,但它是合法的.由于这很疯狂,因此在.NET 2.0中默认值已更改:如果您尝试抛出不是异常的内容,则会自动将其包装在RuntimeWrappedException类中,这显然是一个例外.然后扔掉那个对象.
由于这种奇怪的现象,在C#1.0中,通常看到代码同时执行:
try
{ do something }
catch(Exception)
{ handle the exception }
catch
{ handle the thrown non-exception }
Run Code Online (Sandbox Code Playgroud)
事实上,存在安全性和正确性问题; 在某些情况下,出于安全原因,你必须抓住任何抛出的东西(可能重新抛出它),人们会合理地认为catch(Exception)抓住了一切,但事实并非如此.
幸运的是,自.NET 2.0以来,事情变得更加明智; 如果你需要的话,你可以依靠catch {},catch(Exception) {}并catch(Exception ex) {}抓住一切.
最后:如果出于某些疯狂的原因你想要打开C#1.0行为,你可以放
[assembly:System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows = false)]
Run Code Online (Sandbox Code Playgroud)
在你的程序中.
Don*_*ott 24
简而言之...
Catch 没有参数将收到任何异常,但没有办法解决它.
Catch (Exception)基本上会做同样的事情,因为你已经指定了根Exception类型.相反Catch (IOException),只会抓住这种IOException类型.
Catch (Exception ex)捕获所有异常并提供通过ex变量解决它的方法.
阅读更多:http: //msdn.microsoft.com/en-us/library/ms173160.aspx
所有这些都基本相同,不同之处在于它们提供的有关错误的信息量.
catch (foo ex) {}将过滤掉所有异常,但可以转换为类型的异常除外foo.它还为您提供了错误的实例供您使用.
catch (foo) {}与上面相同,但它没有提供异常的实例.您将知道异常的类型,但无法从中读取信息.
请注意,在这两种情况下,如果异常的类型是Exception,它们将捕获所有异常.
catch {}捕获所有异常.您不知道它捕获的类型,您无法访问该实例.
您可以根据捕获异常所需的信息来选择使用哪一个.
无论您使用哪一个,都可以使用命令throw;(不带参数)向前传递捕获的异常.
| 归档时间: |
|
| 查看次数: |
3066 次 |
| 最近记录: |