2012-02-09 7 views
1

私は自分のサイトでtry catchを追加しました。開発の次の部分は、例外処理の出力を設定することです。明らかに、私は、エラーが発生したときにサイトが崩壊するのを望まず、恐ろしいエラー画面を望んでいません。だから、途中のどこかでいいだろう。 何か問題が発生したときに素晴らしい小さなメッセージを出力するメインのマスターページに例外ハンドラのユーザコントロールがあると思っていました。 このユーザーコントロールに例外を渡す最も良い方法は何ですか?私はセッション変数を使用することを考えていました。ASP.NET例外ユーザーへのプレゼンテーションの処理

誰にもこの問題の解決策がありますか?

ありがとうございました

答えて

5

これはあなたが作成しているよりも簡単です。 error.aspxというページ(またはそれを呼び出すページ)を作成し、web.configのCustomErrorsをオンにします。

<configuration> 
    <system.web> 
    <customErrors defaultRedirect="errors.aspx" 
        mode="On"> 
    </customErrors> 
    </system.web> 
</configuration> 

さまざまなHTTPエラーまたはランダム例外を処理するための設定がたくさんあります。必要に応じて、例外メッセージ(または例外自体)をセッションにダンプするか、HttpServerUtility.GetLastErrordocumentation)を使用して、エラーページに任意の数の異なるメッセージを出力できます。これは、あなたが捕まえない例外をキャッチします。

CustomErrors Documentation

編集:
@IcarusはOPはページのみページ内のエラーメッセージを表示しながら描画して出力し続けることにより、解決策を探しているので、私が提供するだろうことを示している それにも答えてください。

過去にこれを処理した方法はいくつかあります。要求された振る舞いが致命的である(ページの結果を知ることはできない)非常に複雑なページの場合、私は主な主要素を含む上記のように、常にエラーページを延期しています。だから、メニュー、ヘッダーなどはすべてそこにありますが、大惨事の通知は明白です。

あなたが探しているような動作は、一般的なメッセージを報告するよりも、例外を報告する必要性が少なくなります。私の好みは、メッセージを注入できる公開バインド可能なプロパティを持つユーザーコントロールを持つことです。 (VBを許して、私は私のC#バージョンを見つけることができないよう)のような:

<BrowsableAttribute(True), Bindable(False), Category("Misc"), _ 
    Description("Gets or sets the NavigateUrl property for the link to start a new request.")> _ 
Public Property MyImportantMessage() As String 
    Get 
     Return _myImportantMessage 
    End Get 
    Set(ByVal value As String) 
     _myImportantMessage= value 
    End Set 
End Property 

その後、出力はあなたが好きな文字列メッセージかもしれないか、プリセットの数でプログラミングができ、リソースからのフェッチ、なんでも。それを入手する方法については、MasterPageルートを利用しました。マスターコントロールには、そのようなプロパティをユーザーコントロールに直接割り当てるメソッドがあります。このメソッドを呼び出し可能にするには、マスターページを使用する各ページにVirtualPathプロパティを含める必要があります。そうしないと、メソッドはコンパイル時に使用できなくなります。

<%@ MasterType 
    VirtualPath="~/MasterPage.master" %> 

そして、これはMasterプロパティは、このプロパティを呼び出すために、ページ自体の内部から呼び出すことができます

'Keeping the VB theme 
Me.Master.SetImportantMessage(message) 

は、ページ内からMe.MasterPage.Masterと同じではないことに注意してください。だからあなたの例外は、実際のページにバブルする必要があるか、またはページ参照自体をプロパティとしてusercontrolsに送信する必要があります。

+0

は、私は、これはasp.netのウェブサイト上で、持っている必要がありますが、どのようなOP望んでいることは違うもので、彼は何かが間違っていることを、同じページ内でユーザに通知する方法を望んでいることに同意します。 – Icarus

+0

@Icarus:私は初めて質問からそれを読んだことはありませんでしたが、その効果を編集します。ありがとう。 –

+0

+1これは非常に包括的な答えです。 – Icarus

0

処理された例外に対してエラーを提供したい場合は、アプリケーションに要求の処理に問題があったという通知を何らかのラベルで入力するのと同じくらい簡単です。これは、文の「キャッチ」部分で行います。私は、ユーザーの役割に応じて異なるメッセージを表示する限りでさえも行ってきました。たとえば、管理者がエラーを生成した場合、実際の例外メッセージを実際に出力することができますが、役割の低い人がそれを生成すると、より一般的なエラーが表示され、管理グループにメッセージ/メールが送信されます。

try 
{ 
    //your code here 
} 
catch (Exception ex) 
{ 
    if (Role!="Admin") 
    { 
    Label1.Text = "There was an error, the administrator has been notified." 
    } 
    else 
    { 
    Label1.Text = "Error: " + ex.Message + ": " + ex.StackTrace; //you could add further here if you want to look for an inner exception. 
    } 
}