ASP.NETのReponse.Redirectを使用した入れ子のtry-catch
質問
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をキャッチすることです。
所属していません StackOverflow