C# 如何从一个异常处理程序转到另一个异常处理程序?

C# 如何从一个异常处理程序转到另一个异常处理程序?,c#,asp.net,exception,exception-handling,C#,Asp.net,Exception,Exception Handling,解释我的问题的最佳方法是使用以下伪代码: try { //Do work } catch (SqlException ex) { if (ex.Number == -2) { debugLogSQLTimeout(ex); } else { //How to go to 'Exception' handler? } } catch (Exception ex) { debugLogGeneralExc

解释我的问题的最佳方法是使用以下伪代码:

try
{
    //Do work
}
catch (SqlException ex)
{
    if (ex.Number == -2)
    {
        debugLogSQLTimeout(ex);
    }
    else
    {
        //How to go to 'Exception' handler?
    }
}
catch (Exception ex)
{
    debugLogGeneralException(ex);
}

匹配的第一个
catch
子句是唯一可以在同一
try
块上运行的子句

我能想到的最好的方法是在更一般的类型中包含类型转换和条件语句:

try
{
    //Do work
}
catch (Exception ex)
{
    var sqlEx = ex as SqlException;
    if (sqlEx != null && sqlEx.Number == -2)
    {
        debugLogSQLTimeout(ex);
    }
    else
    {
        debugLogGeneralException(ex);
    }
}

如果您发现自己在整个数据层中一遍又一遍地写这篇文章,至少要花点时间将它封装在一个方法中。

匹配的第一个
catch
子句是唯一可以在同一
try
块上运行的子句

我能想到的最好的方法是在更一般的类型中包含类型转换和条件语句:

try
{
    //Do work
}
catch (Exception ex)
{
    var sqlEx = ex as SqlException;
    if (sqlEx != null && sqlEx.Number == -2)
    {
        debugLogSQLTimeout(ex);
    }
    else
    {
        debugLogGeneralException(ex);
    }
}

如果您发现自己在整个数据层中一遍又一遍地写这篇文章,至少要花时间将其封装到一个方法中。

我认为没有任何方法可以做到这一点,因为catch块在不同的范围内。如果不退出try块,就无法重新抛出,也无法“调用”最终catch块,因为它只在异常期间触发

我建议和上面的roman m一样,打同样的电话。否则你必须做一些非常糟糕的事情。就像下面疯狂的代码,你永远不应该使用,但我包括了,因为它做了一些你想要的

一般来说,我认为您所做的是通过不推荐的异常来控制正常流。如果您试图跟踪超时,您可能应该用另一种方式来处理

请注意,您可以使用goto语句的疯狂性来执行下面的代码,但我将其包括在内,这样就不会有人忘记这是一个多么糟糕的主意


我不相信有任何方法可以做到这一点,因为捕捉块在不同的范围内。如果不退出try块,就无法重新抛出,也无法“调用”最终catch块,因为它只在异常期间触发

我建议和上面的roman m一样,打同样的电话。否则你必须做一些非常糟糕的事情。就像下面疯狂的代码,你永远不应该使用,但我包括了,因为它做了一些你想要的

一般来说,我认为您所做的是通过不推荐的异常来控制正常流。如果您试图跟踪超时,您可能应该用另一种方式来处理

请注意,您可以使用goto语句的疯狂性来执行下面的代码,但我将其包括在内,这样就不会有人忘记这是一个多么糟糕的主意


为什么不调试LogGeneralException(ex);代替你的评论?@romanm:正如我所说的,这只是一个伪代码,在我的实际示例中并不是一个真正的函数。我的意思是,你应该用“异常处理程序”逻辑代替你的评论,而不是“去”,你为什么不调试LogGeneralException(ex);代替你的评论?@romanm:正如我所说的,这只是一个伪代码,在我的实际示例中不是一个真正的函数。我的意思是,你应该用“异常处理程序”逻辑代替你的评论,而不是很好地“去”那里。我希望能有一些
重新播放
的命令,但这也会起作用。非常好。我希望能有一些
重新播放
的命令,但这也会起作用。非常好。我不知道一个人可以做出这样的例外。它不会引发自身的例外,对吗?(比方说,如果是算术溢出异常。)在这种情况下,考虑到我们将sqlEx.Number与一个常量值进行比较(我可能会为生产代码声明一个
const
),我不认为出现未处理异常的真正风险。嗯。。。现在我明白你的问题了。。。我想。不,将异常转换为另一种类型的过程不会以某种方式触发该异常的重新引发。你必须
throw()
它才能做到这一点。非常好。我不知道一个人可以做出这样的例外。它不会引发自身的例外,对吗?(比方说,如果是算术溢出异常。)在这种情况下,考虑到我们将sqlEx.Number与一个常量值进行比较(我可能会为生产代码声明一个
const
),我不认为出现未处理异常的真正风险。嗯。。。现在我明白你的问题了。。。我想。不,将异常转换为另一种类型的过程不会以某种方式触发该异常的重新引发。你必须
throw()。我同意roman m对原始代码的评论。不管你做什么,你仍然会做一些疯狂的事情。即使是try/catch/finally也会导致您进行空检查,而不管调用try/catch/finally的每个操作是否出错。可能不会有太多的开销,但这是一件很重要的事情。给出的答案中没有一个是真正“转到”另一个异常处理程序的,因为你不能。=)我希望确保它足够疯狂,没有人会真正使用它。我同意roman m对原始代码的评论。不管你做什么,你仍然会做一些疯狂的事情。即使是try/catch/finally也会导致您进行空检查,而不管调用try/catch/finally的每个操作是否出错。可能不会有太多的开销,但这是一件很重要的事情。给出的答案中没有一个真正“转到”另一个异常处理程序,因为您不能。
void Main()
{
    Madness(new NotImplementedException("1")); //our 'special' case we handle
    Madness(new NotImplementedException("2")); //our 'special' case we don't handle
    Madness(new Exception("2")); //some other error
}

void Madness(Exception e){
    Exception myGlobalError;

    try
    {
        throw e;
    }
    catch (NotImplementedException ex)
    {
        if (ex.Message.Equals("1"))
        {
            Console.WriteLine("handle special error");
        }
        else
        {
            myGlobalError = ex;
            Console.WriteLine("going to our crazy handler");
            goto badidea;
        }
    }
    catch (Exception ex)
    {
        myGlobalError = ex;
        Console.WriteLine("going to our crazy handler");
        goto badidea;
    }
    return;

    badidea:
    try{
        throw myGlobalError;
    }
    catch (Exception ex)
    {
        Console.WriteLine("this is crazy!");
    }
}
// Define other methods and classes here