Catch(Exception)
和Catch(Exception ex)
之间有什么区别?我可以看到两个给我预期的输出。那么实际的区别是什么?推荐哪一个?
假设代码在下面。
int a = 1, b = 0;
try
{
int c = a / b;
Console.WriteLine(c);
}
建议使用以下哪个catch块?这些之间的实际区别是什么?
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
或
catch (Exception)
{
Console.WriteLine("Oh NO!!");
}
答案 0 :(得分:4)
嗯,catch(Exception ex)
与catch(Exception)
相同,但有一点不同
only:在catch(Exception ex)
中我们可以访问异常类(错误原因)
实例。通常,您需要一个异常类实例来打印原始实例
消息:
try {
...
}
catch (AppServerException e) {
Console.WriteLine("Application server failed to get data with the message:");
Console.WriteLine(e.Message); // <- What's actually got wrong with it
}
如果您不需要异常类实例,例如你计划只是为了消费 异常,catch(Exception ex)语法过多而catch(异常)是 prefferable:
try {
c = a / b;
}
catch (DivideByZeroException) {
c = Int.MaxValue; // <- in case b = 0, let c be the maximum possible int
}
最后。 如果不重新执行,请不要捕获常规异常类:
try {
int c = a / b;
}
catch (Exception) { // <- Never ever do this!
Console.WriteLine("Oh NO!!");
}
你真的想要编码“无论出现什么错误(来自CPU的绿色烟雾)” 发生只是打印出“哦不”并继续“?Exception类的模式 是这样的:
tran.Start();
try {
...
tran.Commit();
}
catch (Exception) {
// Whatever had happened, let's first rollback the database transaction
tran.Rollback();
Console.WriteLine("Oh NO!");
throw; // <- re-throw the exception
}
答案 1 :(得分:3)
这很简单:
实际使用的内容取决于您想要提供的有关异常的信息量。
答案 2 :(得分:2)
如果您需要在catch
块中使用例外,请为Exception
命名;否则,请保持匿名。
在某些情况下,catch
块需要做的不仅仅是显示异常的消息。例如,当您捕获特定于应用程序的异常时,您可能能够检查异常对象的其他元素。这是一个假设的例子:
catch (ConnectToServerException cse) {
MessageBox.Show(string.Format(
"Connection to server '{0}' failed. Use a name from the following list: {1}"
, cse.AttemptedConnectionServerName
, string.Join(", ", cse.AllowedServerNames)
));
}
上面的代码假定自定义异常ConnectToServerException
有一个名为AttemptedConnectionServerName
的属性,其中包含您尝试连接的服务器的名称,以及带有名称的枚举属性AllowedServerNames
可用的服务器。
还有一些情况,您需要知道的是特定类型的例外刚刚发生。在这种情况下,您不需要为它提供命名变量。
答案 3 :(得分:0)
Catch (Exception)
做同样的事情,因为它也是Exception
类型。
Catch (Exception ex)
捕获所有异常,此外,您可以通过其引用检索消息。
使用取决于要求,如果您想显示可以使用ex.Message
的异常消息,那么Catch (Exception)
就足够了。
答案 4 :(得分:0)
使用catch(Exception)
,您只需指定要在该catch块中处理的异常类型(在这种情况下,引发的任何异常,因此它与catch
相同)
使用catch(Exception ex)
传递引发的实际异常的实例,这样您就可以访问异常的属性并对提供的信息执行某些操作。
答案 5 :(得分:0)
区别在于会打印尝试除以零。而另一个将打印哦不!。
处理异常是一个复杂的问题,取决于应用程序,但这里几乎没有一般性意见:
一般来说,最好为特定的例外情况提供处理程序:
类似的东西:
catch ({System.DivideByZeroException ex )
{
Console.WriteLine("Ops. I cannot divide by zero." );
}
catch ({System.Exception ex )
{
Console.WriteLine("There was an error during calculations: {0}", ex.Message );
}
迟早你会发现Console.WriteLine
不够好,你必须尽早使用记录器才能尽早开始使用它。
理想情况下,如果您决定向用户公开原始错误消息,则应该打印异常链中的所有消息,或者至少打印最深的消息。
类似的东西:
catch ({System.DivideByZeroException ex )
{
Console.WriteLine("Oops. I cannot divide by zero." );
}
catch ({System.Exception ex )
{
Console.WriteLine(GetExceptionMsgs(ex));
}
...in another class...
public static string GetExceptionMsgs(Exception ex) {
if( ex == null ) {
return "No exception = no details";
}
var sb = new StringBuilder();
while( ex != null ) {
sb.AppendLine(ex.Message);
ex = ex.InnerException;
}
return sb.ToString()
}