我有这段代码:
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");
}
也有效。
这三个街区是否一样?在那种情况下,这是最好的做法吗?
答案 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?");
}
但是,您可能应该使用异常引用,如果只是将它们存储在日志中,以便您可以深入了解程序失败的原因。