で奇妙なエラーが発生しresponse.redirect()
、プロジェクトがまったく構築されていませんでした。コードのブロックを囲んでいたtry-catchResponse.Redirect()
ブロックを削除すると、正常に機能しました。
これが既知の問題なのか何かなのか知りたいだけです...
で奇妙なエラーが発生しresponse.redirect()
、プロジェクトがまったく構築されていませんでした。コードのブロックを囲んでいたtry-catchResponse.Redirect()
ブロックを削除すると、正常に機能しました。
これが既知の問題なのか何かなのか知りたいだけです...
私が正しく覚えていれば、現在のリクエスト(またはそのようなもの)Response.Redirect()
を中止するために例外をスローします。ThreadAbortedException
したがって、その例外をキャッチしている可能性があります。
編集:
このKB記事では、この動作について説明しています(Request.End()
およびServer.Transfer()
メソッドについても)。
Response.Redirect()
過負荷が存在するため:
Response.Redirect(String url, bool endResponse)
を渡すendResponse=false
と、例外はスローされません(ただし、ランタイムは現在の要求の処理を続行します)。
(または他のオーバーロードが使用されている場合endResponse=true
)、例外がスローされ、現在の要求はすぐに終了します。
Martinが指摘しているように、Response.RedirectはThreadAbortExceptionをスローします。解決策は、例外を再スローすることです。
try
{
Response.Redirect(...);
}
catch(ThreadAbortException)
{
throw; // EDIT: apparently this is not required :-)
}
catch(Exception e)
{
// Catch other exceptions
}
Martinは正しいです。Response.Redirectを使用すると、ThreadAbortExceptionがスローされます。こちらのkbの記事を参照してください。
tryブロック内で宣言されている変数を参照している可能性があります。
たとえば、次のコードは無効です。
try
{
var b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
if (b)
{
Response.Redirect("somewhere else");
}
}
b宣言をtry-catchブロックの外側に移動する必要があります。
var b = false;
try
{
b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
if (b)
{
Response.Redirect("somewhere else");
}
}
ここに既知の問題はないと思います。
Redirectは現在のコントロールを別の.aspx(たとえば)に残し、キャッチを空中に残す(戻ることができない)ため、try / catchブロック内でRedirect()を実行することはできません。
編集:一方、私はこれらすべてを逆に考えていたかもしれません。ごめん。