c#中的嵌套异常

时间:2016-01-12 17:40:23

标签: c# exception

有没有办法使用嵌套异常?我有这个代码“一个第一级”:

my func()
{
    try
    {
        resp = Web.FormPostRequest(auth_url, authPost, "", url, cookies, type, proxy_string);

    }


    catch (Exception ex)
    {
        if (ex is xNet.ProxyException)
        {
            throw new xNet.ProxyException();

        }

        if(ex is xNet.NetException)
        {
            //MessageBox.Show(ex.Message);
            throw new xNet.NetException();
            //return false;
        }

    }

}

在“更高级别”我得到了这个:

try
{


    result = myfunc(auth_data[0], auth_data[1], Form1.domain, type, proxy_string);
    break;

}
catch (xNet.NetException ex)
{
    {
        result = false;
        MessageBox.Show(ex.Message);
        return;
    }

}

这笔交易是调试器总是说行处理的是xNet.NetException没有被处理过

if(ex is xNet.NetException)
{
    //MessageBox.Show(ex.Message);
    throw new xNet.NetException();
    //return false;
}
在myfunc()中

。它可能是什么,我该如何解决这个问题?谢谢!

我将代码更改为最简单:

try
{
    resp = Web.FormPostRequest(auth_url, authPost, "", url, cookies, type, proxy_string);

}


catch (Exception ex)
{
    throw;
}

但即使是现在,视觉stuido仍然表示存在未处理的xNet.NetException。

3 个答案:

答案 0 :(得分:2)

除非你有非常好的理由来创建新的异常并吞下除了这两种类型之外的其他所有类型,否则我只会更改你的catch块以在所有情况下重新抛出原始异常:

catch (xNet.ProxyException ex)
{
    // is there something you want to do here?
    throw;  // let the caller handle all exceptions.
}
catch(xNet.NetException ex)
{
     // is there something you want to do here?
    throw;  // let the caller handle all exceptions.
}
catch
{
    throw;  // let the caller handle all exceptions.
}

如果你不打算在任何一个处理程序中执行任何操作,那么你可以删除整个catch块并让异常自然地冒泡。

答案 1 :(得分:2)

你能抓住你想要抓住的特定例外情况,让剩下的“流过”吗?

catch (xNet.ProxyException ex) {
     //re-throwing per the comment(s) in a smarter guy's answer.
     throw new Exception("Adding really important info here.",ex);
}
catch (xNet.NetException exToo) {
     //MessageBox.Show(ex.Message);
     //return false;
     //blah .. blah ..
}

我们使用SQL异常来做到这一点并且效果非常好。它允许我们根据SQL服务器抛出的特定错误准确捕获我们想要捕获的数据(抱歉在堆栈帖子中使用'tossed-off'...漫长的一天)。

有一些规则可以控制多个catch块,但I'm too lazy to type them out here

此外 - 在blatent尝试扩展此答案以包含一个未提问题 - 以下格式也适用于c#6

catch (Exception ex) when (ex is xNet.ProxyException || ex is xNet.NetException) {                
    //please go away...
}

无论哪种方式,你只能抓住你想要处理的东西,对吧?然后,如果您需要外部catch块中的堆栈,请查看innerException(因为我们正在使用您的新数据创建一个小的嵌套异常)。

最后一个(次要)注(编辑)

根据评论,您在原始问题中提供的示例代码似乎抛出了一种类型的错误,但外部catch块正在捕获不同的错误类型。

内部功能:

throw new xNex.ProxyException();

外部功能:

catch(xNet.NetException ex) ...

也许这只是因为你做了一些编辑以使这更容易阅读,但也许检查你的代码?当你被拨入时很难看到这些错误!

答案 2 :(得分:1)

  

我该如何解决这个问题?

嗯,首先应该删除整个catch块:

catch (Exception ex)
{
    if (ex is xNet.ProxyException)
    {
        throw new xNet.ProxyException();
    }
    if(ex is xNet.NetException)
    {
        //MessageBox.Show(ex.Message);
        throw new xNet.NetException();
        //return false;
    }
}

它不仅实际上没有做任何事情来处理异常,而且它明确地抛弃异常并将其替换为没有任何信息的异常。关于发生的错误。

所以最终的方法就是:

void MyFunc()
{
    resp = Web.FormPostRequest(auth_url, authPost, "", url, cookies, type, proxy_string);
}

如果方法 有一些信息要添加到异常中,那么你至少应该保留原始异常:

void MyFunc()
{
    try
    {
        resp = Web.FormPostRequest(auth_url, authPost, "", url, cookies, type, proxy_string);
    }
    catch (Exception ex)
    {
        // do something here?
        throw new SomeExceptionType(ex);
    }
}

或者,如果没有要添加的新信息(但仍然对有意义的话),至少重新抛出原始异常:

void MyFunc()
{
    try
    {
        resp = Web.FormPostRequest(auth_url, authPost, "", url, cookies, type, proxy_string);
    }
    catch (Exception ex)
    {
        // do something here
        throw;
    }
}

但是,除非你可以做某些事情来实际处理或以任何方式回应例外,否则不要去抓它。它只能由可以有意义地处理它的代码捕获。