首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试捕多捕的基本问题

试捕多捕的基本问题
EN

Stack Overflow用户
提问于 2019-10-21 08:36:31
回答 3查看 52关注 0票数 2

我想抓住在不同的步骤抛出的异常。请看下面的代码。假设每个函数Procedure1Procedure2、.、Procedure6可能抛出各种异常(可能重叠!)。如果异常发生在步骤1-3,我想抛出新定义的异常ex1和步骤4-6 ex2

代码语言:javascript
复制
public void TestFunc(){
    try{
        var res1 = Procedure1();
        var res2 = Procedure2(res1);
        var res3 = Procedure3(res2);
        var res4 = Procedure4(res3);
        var res5 = Procedure5(res4);
        Procedure6(res5);
    }
    catch{
        // if error/exception occurs in step 1-3 throw exception 1
    }
    catch{
        // if error/exception occurs in step 4-6 throw exception 2
    }
}

我读过https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-catch,但并没有明白重点。

如果所有步骤都抛出不同的异常,那么我可以捕获不同的异常。但不同步骤的例外情况可能会重叠。因此,我无法从异常消息中真正分辨出这是哪一步。(是的,这可以通过添加关于异常消息的额外信息来克服,但我真的不想修改其他函数。)

我能想到的一种方法是将TestFunc分成两部分,但我真的不想这样做,因为它破坏了函数的完整性。

如果我们将这些步骤分成两个try,编辑器将显示消息res3 does not exist in the context。这是合理的,因为{}分离了上下文。

代码语言:javascript
复制
public void TestFunc(){
    try{
        var res1 = Procedure1();
        var res2 = Procedure2(res1);
        var res3 = Procedure3(res2);
    }
    catch{
        // if error in step 1-3 throw exception 1
    }
    try{
        var res4 = Procedure4(res3); // error, res3 cannot be found in the context
        var res5 = Procedure5(res4);
        Procedure6(res5);
    }
    catch{
        // if error in step 4-6 throw exception 2
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-21 08:49:39

我建议嵌套结构

代码语言:javascript
复制
   try {
        var res1 = Procedure1();
        var res2 = Procedure2(res1);
        var res3 = Procedure3(res2);

        try { 
            var res4 = Procedure4(res3);
            var res5 = Procedure5(res4);

            Procedure6(res5); 
        }
        catch {
            // Specific exceptions if error/exception occurs in step 4-6 
        }   
    }
    catch {
        // Exceptions within res1...res3
        // Unspecific Exceptions within steps 4-6
    }
票数 3
EN

Stack Overflow用户

发布于 2019-10-21 08:48:40

只需在try之外声明变量

代码语言:javascript
复制
public void TestFunc(){
    // declare all variables here
    ResultType res1, res2, res3, res4, res5;
    try{
        res1 = Procedure1();
        res2 = Procedure2(res1);
        res3 = Procedure3(res2);
    }
    catch{
        // if error in step 1-3 throw exception 1
    }
    try{
        res4 = Procedure4(res3); // error, res3 cannot be found in the context
        res5 = Procedure5(res4);
        Procedure6(res5);
    }
    catch{
        // if error in step 4-6 throw exception 2
    }
}
票数 0
EN

Stack Overflow用户

发布于 2019-10-21 08:50:21

当您开始使用这个级别的错误处理编写代码时,它必然会变得非常冗长,并且您的大部分代码最终都会处理错误案例。你应该接受这个事实。

这样做的一种方法是,正如你已经描述的那样:

代码语言:javascript
复制
Res1 res1;
try
{
    res1 = Procedure1();
}
catch ....

Res2 res2;
try
{
    res2 = Procedure2(res1);
}
catch ....

或者,您可以在它们自己的助手方法中编写这些过程,这些方法处理它们的错误处理:

代码语言:javascript
复制
private Res1 HandleProcecure1()
{
    try
    {
        return Procedure1();
    }
    catch ....
}

private Res2 HandleProcecure2(Res1 res1)
{
    try
    {
        return Procedure2(res1);
    }
    catch ....
}

...

var res1 = HandleProcedure1();
var res2 = HandleProcedure2(res1);

除非有方法需要完全相同的异常处理,我个人不喜欢尝试和分组它们。给每个自己的set catch语句,并编写一些助手方法,这意味着您避免在每个语句中编写相同的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58482586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档