在c#中尝试catch的不同方法

时间:2011-04-07 10:31:09

标签: c# exception-handling try-catch

我有这段代码:

try
 {
// DO SOMETHING
 }
catch (Exception e)
 {  
    throw new WebPartPageUserException("YEAH MESSAGE");
}

并且编译器向我发送了一个不使用变量的警告。

然后我改为

try
{
 // DO SOMETHING
}
catch (Exception)
{  
     throw new WebPartPageUserException("YEAH MESSAGE");
}

没关系,但最后我知道了

try
{
    // DO SOMETHING
}
   catch 
{  
   throw new WebPartPageUserException("YEAH MESSAGE");
}

也有效。

这三个街区是否一样?在那种情况下,这是最好的做法吗?

6 个答案:

答案 0 :(得分:10)

他们正在做同样的事情并且他们所有不良做法,因为你捕获所有例外,甚至没有记录异常细节。我们无法知道WebPartPageUserException的真正原因。

答案 1 :(得分:2)

这取决于你想要什么。仅catch就会遇到任何异常。是的,它与catch (Exception)相同。有时您希望以不同的方式捕获特殊异常。像NullReferenceException一样,你必须指定它。如果您希望将异常作为变量,则可以说catch (NullReferenceException e)然后说:e.StackTrace()或类似的东西。

所以,在这种情况下,它是相同的,但有些方法不会相同。

我同意@Daniel的不良做法,但有时它是需要的。

更新
如果捕获异常并抛出一个新异常,则可以将捕获的异常设置为新异常的内部异常

答案 2 :(得分:2)

你应该这样做:

try
{
    // DO SOMETHING
}
catch (Exception ex)
{  
    throw new WebPartPageUserException("YEAH MESSAGE", ex);
}

请注意ex中使用WebPartPageUserException作为内部异常参数。不提供内部异常意味着您遗漏了有关实际错误的有价值信息。你应该几乎总是包含内部异常。

答案 3 :(得分:1)

Dunno关于最佳实践,但我个人远离通用的“catch all”尝试catch块...尝试编写代码,以便测试会导致异常的场景并使代码流适当地处理错误案例。

答案 4 :(得分:1)

catch (Exception)仅捕获类型Exception的异常或从中继承的异常。 catch捕获所有异常。

由于大多数(所有?)异常都是从Exception继承的,所以#2和#3会做同样的事情。对于最佳实践,只捕获那些可以优雅处理的异常。 (你应该考虑你的try-Block可以抛出的所有异常,或者至少尝试^^)

答案 5 :(得分:1)

如果您根本不打算使用Exception参考,请使用最后一个选项。第二个选项,如所写,仅捕获从“异常”或子类派生的异常。如果要区分不同类型的异常,但不使用异常引用,则使用此样式的异常处理非常有用。例如:

try
{
     DoSomething();
}
catch (NotSupportedException)
{
     Console.Error.WriteLine("The software won't do what you wanted it to");
}
catch (InvalidOperationException)
{
     Console.Error.WriteLine("A possible programming error in the software?");
}

但是,您可能应该使用异常引用,如果只是将它们存储在日志中,以便您可以深入了解程序失败的原因。