在C#中使用try-catch块的正确方法是什么

时间:2011-01-04 17:21:00

标签: c# exception exception-handling try-catch

我想知道您对应用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
}

这是正确的方法吗?或者我正在使用“抛出”句子?

7 个答案:

答案 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;
             }

         }