C# 在C中使用try catch块的正确方法是什么#
我想知道您对应用try-catch块捕获异常的正确方法的看法 假设我有4个层次结构方法,它们是这样的调用: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
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关键字,这样如果抛出异常,它会自动释放(如果适用!)我想我明白了,我的直觉不正确,我想让代码的内部部分更加健壮,能够处理错误,但正确的方法似乎是在更外层处理问题。我还有其他相关问题。如果广泛使用内部代码