質問

try catchブロックをネストしています

try
{
    // statements
    try
    {
        // statements
    }
    catch(SqlException sqlex)
    {
        Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(sqlex.Message)
                              + "&src=" + Server.UrlEncode(sqlex.ToString()));
    }
    catch (Exception ex)
    {
        Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(ex.Message)
                              + "&src=" + Server.UrlEncode(ex.ToString()));
    }
    finally
    {
        conn.Close();
    }
}
catch (Exception ex)
{
    Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(ex.Message)
                          + "&src=" + Server.UrlEncode(ex.StackTrace)); 
}
finally
{
    conn.Close();
}

SqlExeceptionが内側の最初のcatchブロックでキャッチされた場合、try ... catchが Response.Redirect を囲むため、転送によって生成されたThreadAbortExceptionは外側のcatchブロックでキャッチされます。

この問題を解決するにはどうすればよいですか?ありがとう!

役に立ちましたか?

解決

この記事

を読む

最も簡単にできることは、try / catchハーネス内でリダイレクトしないことです。

string url ;
try 
     { 
            // statements 
            try 
            { 
            } 
            catch(SqlException sqlex) 
            { 
               url = @"~/Error.aspx?err=" + Server.UrlEncode(sqlex.Message) + "&src=" + Server.UrlEncode(sqlex.ToString()); 
            } 
            catch (Exception ex) 
            { 
                url = @"~/Error.aspx?err=" + Server.UrlEncode(ex.Message) + "&src=" + Server.UrlEncode(ex.ToString()); 
            } 
            finally 
            { 
                conn.Close(); 
            } 
    } 
    catch (Exception ex) 
        { 
            url = @"~/Error.aspx?err=" + Server.UrlEncode(ex.Message) + "&src=" + Server.UrlEncode(ex.StackTrace);  
        } 
        finally 
        { 
            conn.Close(); 
        } 
} 

if ( url != "" ) {
    Response.Redirect(url);
}
else {
    // Page logic can continue
}

他のヒント

最初の応答のコードの変更を検討する

if ( url != "" ) { Response.Redirect(url);}

to

if (!string.IsNullOrEmpty(url)) { Response.Redirect(url);}

変数を使用して、内部try ... catchでエラーがスローされたタイミングを追跡し、Response.Redirectをifステートメントで囲むことにより、2番目のエラーをチェックします。

try-catchブロック内でResponse.Redirectを使用するたびに、2番目のパラメーターを追加する必要があります。

これの代わりに:

Response.Redirect("somepage.aspx");

これを実行:

Response.Redirect("somepage.aspx", false);

そのブール値がtrueの場合、ページのコンテンツは新しいページに送信されます(フォームの値を使用できます)。 そのブール値がfalseの場合、ページのコンテンツは送信されません。これはおそらくあなたが望むものです。 trueが必要かどうかはわかります。

これに対する別のアプローチは、空のCatchブロックでThreadAbortExceptionをキャッチすることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top