0

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

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

3 回答 3

3
Exception ex = null;
try
{
    //Do work
}
catch (SqlException sqlEx)
{
    ex = sqlEx;
    if (ex.Number == -2)
    {
       //..
    }
    else
    {
        //..
    }
}
catch (Exception generalEx)
{
  ex = generalEx;
}
finally()
{
  if (ex != null) debugLogGeneralException(ex);
}
于 2013-03-17T06:40:50.970 回答
1

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

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

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

如果您发现自己在整个数据层一遍又一遍地编写此代码,至少要花时间将其封装在一个方法中。

于 2013-03-17T07:01:38.033 回答
0

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

我会建议与上面的 roman m 相同,然后进行相同的调用。否则你必须做一些非常糟糕的事情。就像下面你永远不应该使用但我包括在内的疯狂代码,因为它做了你想要的事情。

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

请注意,您可以使用 goto 语句的疯狂来执行以下代码之类的操作,但我将其包含在内,因此没有人会忘记这是一个多么糟糕的主意。=)

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
于 2013-03-17T07:14:48.997 回答