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 に答える