2

すべての例外をインターセプトしようとしていますが、コードは実行されません。これを に入れてみGlobalFiltersました。また、メソッドに直接入れてみました。

私の属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class HandleExceptionAttribute : HandleErrorAttribute 
{
    private ILog log = LogManager.GetLogger(typeof(HandleExceptionAttribute));

    public override void OnException(ExceptionContext filterContext) 
    {
        log.Info("inside on exception"); // this never appears
    }
}

私のクラス:

public class Tester 
{
    [HandleException]
    public void Except() 
    {
        var asd = 0;
        var qwe = 1 / asd;              
    }
}

ゼロで除算すると例外が発生し、デバッガーがそれをキャッチして続行しますが、ログ ファイルには何も書き込まれません。

ロガーは動作します。その他のログはファイルに表示されます。デバッグを無効にしても、ログ ファイルは読み取られないため、デバッガーのせいではありません。

これを IIS Express で実行します。Windows 7。

編集:

ものをコントローラーに移動しました。まだ動作していません

public class UserController : ApiController 
{
    private ILog log = LogManager.GetLogger(typeof(UserController));

    [HandleException]
    [CheckModelForNull]
    [ValidateModelState]
    public object Post([FromBody]User user) 
    {    
        var asd = 0;
        var qwe = 1 / asd;
        return new HttpStatusCodeResult(HttpStatusCode.OK);
    }
}
4

2 に答える 2

4

コメントに記載されているように、フィルター属性はコントローラーのアクションにのみ適用されます。他のクラスからのエラーや、コードがアクションに入る前に発生したこともキャプチャしたい場合は、Application_ErrorメソッドをGlobal.asax次のように上書きする必要があります。

protected void Application_Error(object sender, EventArgs e)
{
    log.Info("inside on exception"); 
}
于 2014-01-23T17:16:27.810 に答える