我想知道我是否可以安全地编写catch()来捕获所有System.Exception类型。或者我必须坚持捕捉(例外)来实现这一目标。我知道其他异常类型(例如InvalidCastException),我必须将类型指定为catch(InvalidCastException)。换句话说,我问的是以下代码示例是否相同。
这......
try
{
//do something
}
catch(Exception)
{
//handle exception
}
这......
try
{
//do something
}
catch() //Causes compile time error "A class type expected"
{
//handle exception
}
这......
try
{
//do something
}
catch
{
//handle exception
}
更新:我的问题出错了。 c#中不允许catch()
。
答案 0 :(得分:13)
在一个完美的世界中,你根本不应该使用catch(Exception)
或catch
(单独),因为你永远不应该捕获泛型Exception
例外。您总是应该捕获更具体的异常(例如InvalidOperationException
...等。)。
在现实世界中,catch(Exception)
和catch
(单独)都是等价的。我建议您在计划仅重用异常变量时使用catch(Exception ex)
,而在其他情况下使用catch
(单独)。只是第二个用例的风格问题,但如果个人觉得它更简单。
真正重要的是什么(即使它超出了您的问题范围)是您永远不会编写以下代码:
try
{
}
catch (SpecificException ex)
{
throw ex;
}
这会将堆栈跟踪重置为throw的点。另一方面:
try
{
}
catch (SpecificException)
{
throw;
}
保持原始堆栈跟踪。
答案 1 :(得分:6)
这两个构造(catch ()
是语法错误,正如sh4nx0r正确指出的那样)在C#中表现相同。两者都被允许的事实可能是从C ++语法继承的语言。
Others languages, including C++/CLI,可以throw
个来自System.Exception
的对象。在这些语言中,catch
将处理这些非CLS例外,但catch (Exception)
不会。
答案 2 :(得分:2)
catch(Exception ex)
可以处理从System.Exception
类派生的所有异常,但是如果抛出的异常不是从System.Exception
派生的,那么catch(Exception ex)
将不会处理它。
在.NET 3.0之前,由不安全代码抛出的异常(即代码未针对CLR)由catch{}
处理。在.NET Framework 3.0之后,System.Exception
类可以处理所有类型的异常。 catch{}
现已过时。
答案 3 :(得分:1)
看一下这个链接: http://msdn.microsoft.com/en-gb/library/0yd65esw.aspx
我认为没关系,不管有没有但是你可以让语句catch中的参数获得你想要的正确异常并正确处理它们。
答案 4 :(得分:-1)
如果发生异常这一事实意味着您需要运行一段代码,但除非重新抛出异常,否则您不会对异常执行任何操作,否则首选方法可能不会捕获异常但是而是做类似的事情:
bool ok=false; try { ... do stuff -- see note below about 'return' ok = true; } finally { if (!ok) { ... cleanup code here } }
这种模式的一个缺点是必须在ok = true;
块内发生的任何return语句之前手动添加try
(并确保不存在异常(除了ThreadAbortException之外)可以发生在ok = true;
和返回之间。否则,如果一个人不会对异常做任何事情,那么就不应该抓住它。