Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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语言中的嵌套异常#_C#_Exception - Fatal编程技术网

C# c语言中的嵌套异常#

C# c语言中的嵌套异常#,c#,exception,C#,Exception,有没有办法使用嵌套异常?我有这个代码“一级”: 在“更高的层次”上,我有以下几点: 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);

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

在“更高的层次”上,我有以下几点:

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

}
交易是调试器总是说excpetion 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;
}
但即使现在VisualStuido说还有xNet.NetException未处理。

除非您有很好的理由创建新异常并吞下除这两种类型以外的所有类型,否则我只需更改您的
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
块,让异常自然冒泡。

除非您有很好的理由创建新异常并吞下除这两种类型之外的所有异常,否则我只需更改
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
块,让异常自然地冒出来

我如何解决这个问题

首先,您应该删除整个
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;
    }
}
但是,除非你能做些什么来实际处理或以任何方式响应异常,否则不要费心捕捉它。它应该只被能够有意义地处理它的代码捕获

我如何解决这个问题

首先,您应该删除整个
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;
    }
}

但是,除非你能做些什么来实际处理或以任何方式响应异常,否则不要费心捕捉它。它应该只被能够有意义地处理它的代码捕获。

您能捕获您想要捕获的特定异常并让其余的“通过”吗

我们使用SQL异常来实现这一点,并且工作得非常好。它让我们能够根据SQL server抛出的特定错误准确地捕获我们想要捕获的数据(很抱歉在堆栈中使用“抛出”…漫长的一天)

有一些规则管理多个catch块,但是

此外,为了将这个答案扩大到包括一个联合国提出的问题,下面的格式也适用于c#6

无论哪种方式,您只捕获您想要处理的内容,对吗?然后,如果您需要外部catch块中的堆栈,请查看innerException(因为我们正在用新数据创建一个小型嵌套异常)

最后一个(次要)注释(编辑) 根据注释,您在原始问题中提供的示例代码似乎抛出了一种类型的错误,但外部catch块捕获的是另一种错误类型

内部功能:

throw new xNex.ProxyException();
catch(xNet.NetException ex) ...
外部功能:

throw new xNex.ProxyException();
catch(xNet.NetException ex) ...

也许这只是因为你做了一些编辑,使它更容易阅读,但也许检查你的代码?当你接通电话时,很难看到那些错误

您是否可以捕获您想要捕获的特定异常,然后让其余的异常“通过”

我们使用SQL异常来实现这一点,并且工作得非常好。它让我们能够根据SQL server抛出的特定错误准确地捕获我们想要捕获的数据(很抱歉在堆栈中使用“抛出”…漫长的一天)

有一些规则管理多个catch块,但是

此外,为了将这个答案扩大到包括一个联合国提出的问题,下面的格式也适用于c#6

无论哪种方式,您只捕获您想要处理的内容,对吗?然后,如果您需要外部catch块中的堆栈,请查看innerException(因为我们正在用新数据创建一个小型嵌套异常)

最后一个(次要)注释(编辑) 根据注释,您在原始问题中提供的示例代码似乎抛出了一种类型的错误,但外部catch块捕获的是另一种错误类型

内部功能:

throw new xNex.ProxyException();
catch(xNet.NetException ex) ...
外部功能:

throw new xNex.ProxyException();
catch(xNet.NetException ex) ...

也许这只是因为你做了一些编辑,使它更容易阅读,但也许检查你的代码?当你接通电话时,很难看到那些错误

为什么不在嵌套异常上进行简单的
C#MSDN谷歌搜索
为什么要抛出相同类型的新异常而忽略所有其他异常?你可以使用
throw以保留原始异常和调用堆栈。为什么要这样做?整个
catch
块(第一个)不仅是多余的,实际上它还丢弃了有用的异常信息。@David,为什么它是多余的?我使用的库有3种异常类型,我需要正确处理其中的两种。@АПСаааПППааааа但您没有在任何地方处理它们