2

在我MVC6的应用程序,我创建了一个中间件处理与如下调用任务的全局未处理的异常:MVC6 - 处理未处理的异常,仍然有错误页面重定向

try 
{ 
    await _next.Invoke(context); 
} 
catch (System.Exception e) 
{ 
    ... Log the exception here... 
} 

我面临的问题是,如果在添加UseDeveloperExceptionPage/UseExceptionHandle之前,我在配置部分添加了这个,然后在中间件中的catch块没有被击中。 当我在UseDeveloperExceptionPage/UseExceptionHandle之后添加这个时,错误页面或模块没有得到处理。

我怎么能不打扰错误页面/模块,但仍然捕捉管道中的错误并记录它?

在此先感谢。

回答

1

这是因为Exception页面需要​​有一个Exception对象才能使用。你的代码捕获异常,然后被抑制。尝试重新抛出异常,像这样:

try 
{ 
    await _next.Invoke(context); 
} 
catch (System.Exception e) 
{ 
    //Log the exception here... 
    throw; 
} 
+0

谢谢elolos。我由于某种原因删除了投掷,并没有观察到它不在那里。感谢你的回答。 –

1

只是重新抛出的错误将导致堆栈跟踪显示错误起源于中间件。你将需要抛出这样的错误:ExceptionDispatchInfo.Capture(e).Throw();

+0

'throw e;'会导致堆栈跟踪丢失,但不会'抛出;'自己做和'ExceptionDispatchInfo.Capture(e).Throw();'一样的事情。 – Ryan

+0

是的,你应该只写投掷;在C#中。做前ex;是编写c#时常见的java程序员错误。所以做一些像catch(exception ex){logger.log(ex);扔; } – Johan