我想知道您对应用try-catch块捕获异常的正确方法的看法。
假设我有4个级别的层次结构方法,就像这样调用:
method1(){
method2(){
method3(){
method4()
}
morecode that depend of what happend in method3
}
morecode that depend of what happend in method2
}
所以我所做的是从内到外包含将要呈现异常的可能方法,因为我的代码依赖于在这些方法中发生的不同级别,我使用“throw”句子传播异常以避免这些代码会导致崩溃。
method1(){
try
method2(){
try
method3(){
try
method4()
catch
throw
}
catch
throw
morecode that depend of what happend in method3
}
catch
return
morecode that depend of what happend in method2
}
这是正确的方法吗?或者我正在使用“抛出”句子?
答案 0 :(得分:6)
如果您要在catch
中完成所有操作,请不要再使用try
。
异常会冒出来,所以没有必要像这样抓住并重新抛出 - 你仍然会得到正确的堆栈跟踪。
答案 1 :(得分:4)
你应该在第一级抓住你想要实际 DO 某些事情的异常。
如果最终结果是相同的“通用”操作,则无需多个try-catch块。只需使用一个catch并处理错误。
但是,如果一个catch块改变了结果,这样调用方法可以做出不同的反应,那么就应该嵌入它。
异常处理是一个相当复杂但重要的话题......
有关主题的建议标题:Robust ASP.Net Exception Handling
答案 2 :(得分:1)
(就个人而言)我会尝试解决每个'特殊'案例,然后只会在需要的try/catch
块中丢失代码。
答案 3 :(得分:0)
只有在finally块中需要清理某些内容时,才需要在调用hirachy中进一步调低try / catch块。如果您要再次抛出异常,则需要添加不需要的代码。
如果对象实现IDisposable,您还可以使用下限使用块。
答案 4 :(得分:0)
仅在您知道如何处理异常时捕获异常。 其他做法是通过将原始异常设置为内部异常来重新抛出新异常。在某些情况下,它有助于更好地处理异常。
答案 5 :(得分:0)
你只需要使用一个try方法,考虑到try语句中是否有任何失败,那么catch语句就会发生。你不想抛出异常,想要尝试处理异常,只在事件发生时无法处理时抛出异常。
以某种方式设计您的应用程序,以便您可以避免像您发布的那样的设计。
答案 6 :(得分:0)
您可以尝试这样的事情:
try
{
// Your code
}
catch (Exception ex)
{
switch (ex.Message)
{
case "Some system exception information":
MessageBox.Show("Your text to replace system exception information",
"Warning",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
break;
default:
MessageBox.Show(ex.Message,
"Warning",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
break;
}
}