Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用try catch块的正确方法是什么#_C#_Exception_Exception Handling_Try Catch - Fatal编程技术网

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

C# 在C中使用try catch块的正确方法是什么#,c#,exception,exception-handling,try-catch,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 } tr

我想知道您对应用try-catch块捕获异常的正确方法的看法

假设我有4个层次结构方法,它们是这样的调用:

method1(){
   method2(){
       method3(){
          method4()
       }
       morecode that depend of what happend in method3
   }
   morecode that depend of what happend in method2
}
        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;
             }

         }
因此,我要做的是从内到外包装可能出现异常的方法,因为我有代码,这些代码取决于这些方法中发生的不同级别,所以我使用“抛出”语句传播异常,以避免这些代码产生崩溃

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
}

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

(个人)我会尝试解决每一个“例外”情况,然后只在需要的地方用
try/catch
块丢弃代码。

(个人)我会尝试解决每一个“例外”情况,然后只在需要的地方将
try/catch
块丢弃在代码中。

如果你在
catch
中要做的就是重新抛出,那么根本不用担心
try


异常将冒泡出现,因此不需要像那样捕获和重新抛出-您仍将获得正确的堆栈跟踪。

如果您在
捕获中要做的就是重新抛出,那么根本不用担心
try


异常将冒泡出现,因此不需要像那样捕获和重新抛出-您仍将获得正确的堆栈跟踪。

您应该在第一个级别捕获异常,在那里您希望实际执行一些操作

如果最终结果是相同的“通用”操作,则不需要有多个try-catch块。只需使用一个catch并处理错误

但是,如果catch块改变了结果,使得调用方法可以做出不同的反应,那么应该嵌入它

异常处理是一个相当复杂但重要的主题


主题的建议标题:

您应该在第一级捕获异常,在第一级中您希望实际做一些事情

如果最终结果是相同的“通用”操作,则不需要有多个try-catch块。只需使用一个catch并处理错误

但是,如果catch块改变了结果,使得调用方法可以做出不同的反应,那么应该嵌入它

异常处理是一个相当复杂但重要的主题


建议的主题标题:

只有当您在最后一个区块中有一些东西需要清理时,才需要在您的call hirachy中进一步设置try/catch区块。如果您只是想再次抛出异常,那么您正在添加不需要的代码


如果对象实现IDisposable,您还可以在下面使用Using块。

只有在最后一个块中有需要清理的内容时,才需要调用hirachy中更下面的try/catch块。如果您只是想再次抛出异常,那么您正在添加不需要的代码


如果对象实现IDisposable,您也可以在下面使用Using块。

只有在您知道如何处理异常的情况下才能捕获异常。
另一种做法是通过将原始异常设置为内部异常来重新生成新异常。在某些情况下,它有助于更好地处理异常。

只有在您知道如何处理异常的情况下才能捕获异常。
另一种做法是通过将原始异常设置为内部异常来重新生成新异常。在某些情况下,它有助于更好地处理异常。

您只需使用一个try方法,考虑到如果try语句中出现任何失败,那么catch语句就会发生。您不想抛出异常,而是想尝试处理它们,并且只在发生无法处理的事件时抛出异常


以某种方式设计应用程序,以避免像您发布的那样的设计。

您只需使用一个try方法,考虑到如果try语句中出现任何失败,那么catch语句就会发生。您不想抛出异常,而是想尝试处理它们,并且只在发生无法处理的事件时抛出异常


以某种方式设计应用程序,以避免类似于您发布的设计。

您可以尝试以下方法:

method1(){
   method2(){
       method3(){
          method4()
       }
       morecode that depend of what happend in method3
   }
   morecode that depend of what happend in method2
}
        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;
             }

         }

您可以尝试以下方法:

method1(){
   method2(){
       method3(){
          method4()
       }
       morecode that depend of what happend in method3
   }
   morecode that depend of what happend in method2
}
        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;
             }

         }

@Daniel Peñalba:你用了错误的方法——“throw ex”重置堆栈跟踪。丹尼尔·佩尼尔巴:如果你推荐它,你就不理解它。几乎没有足够的信息来假设某件事。@Daniel Peñalba:你的想法是错误的——“throw ex”重置堆栈跟踪。丹尼尔·佩尼尔巴:如果你推荐它,你就不理解它。几乎没有足够的信息来假设某件事或另一件事。好的方面,许多人不幸地这样做(很可能是错误的)。好的方面,许多人不幸地这样做(很可能是错误的)。这就是发生在我身上的事,catch块用于将事物恢复到正常状态,因为在尝试运行那些崩溃方法时,它们使不同的对象处于错误状态。也许我的代码太耦合了。如果,如您所说,您的异常使代码处于错误状态,那么是的,在FINALLY块中使用TRY和FINALLY blocks-de-allocate,但允许异常在堆栈中冒泡到您真正想要处理异常的位置。否则,您将永远捕获并抛出异常,这可能会导致以后的问题。或者,使用USING关键字,这样如果抛出异常,它会自动释放(如果适用!)我想我明白了,我的直觉不正确,我想让代码的内部部分更加健壮,能够处理错误,但正确的方法似乎是在更外层处理问题。我还有其他相关问题。如果广泛使用内部代码