9

で奇妙なエラーが発生しresponse.redirect()、プロジェクトがまったく構築されていませんでした。コードのブロックを囲んでいたtry-catchResponse.Redirect()ブロックを削除すると、正常に機能しました。

これが既知の問題なのか何かなのか知りたいだけです...

4

5 に答える 5

23

私が正しく覚えていれば、現在のリクエスト(またはそのようなもの)Response.Redirect()を中止するために例外をスローします。ThreadAbortedExceptionしたがって、その例外をキャッチしている可能性があります。

編集:

このKB記事では、この動作について説明しています(Request.End()およびServer.Transfer()メソッドについても)。

Response.Redirect()過負荷が存在するため:

Response.Redirect(String url, bool endResponse)

を渡すendResponse=falseと、例外はスローされません(ただし、ランタイムは現在の要求の処理を続行します)。

(または他のオーバーロードが使用されている場合endResponse=true)、例外がスローされ、現在の要求はすぐに終了します。

于 2009-06-30T13:19:34.580 に答える
4

Martinが指摘しているように、Response.RedirectはThreadAbortExceptionをスローします。解決策は、例外を再スローすることです。

try  
{
   Response.Redirect(...);
}
catch(ThreadAbortException)
{
   throw; // EDIT: apparently this is not required :-)
}
catch(Exception e)
{
  // Catch other exceptions
}
于 2009-06-30T13:21:29.617 に答える
3

Martinは正しいです。Response.Redirectを使用すると、ThreadAbortExceptionがスローされます。こちらのkbの記事を参照してください。

于 2009-06-30T13:22:04.687 に答える
0

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");
  }
}
于 2009-06-30T13:26:30.417 に答える
-3

ここに既知の問題はないと思います。

Redirectは現在のコントロールを別の.aspx(たとえば)に残し、キャッチを空中に残す(戻ることができない)ため、try / catchブロック内でRedirect()を実行することはできません。

編集:一方、私はこれらすべてを逆に考えていたかもしれません。ごめん。

于 2009-06-30T13:22:07.947 に答える