当前位置: 首页 > 编程语言 > C#

异常处理中间件和页面共享

时间:2023-04-11 02:04:09 C#

异常处理中间件和页面我是中间件概念的新手,目前正在为我的MVC核心项目中的异常处理而苦苦挣扎。我想要发生的是捕获异常,记录它,然后将用户发送到一个带有消息的友好错误页面。起初,我试图在中间件中管理所有这些,但意识到我可能做得不对。所以如果我希望这个流程发生,我应该使用我的异常记录中间件和app.UseExceptionHandler("/Error")以便中间件将异常重新抛出到页面吗?如果是这样,如何在错误页面中获取异常详细信息?我觉得应该先拦截的异常处理机制应该是Configure中的最后一个吧?它是否正确?我发现的所有示例都严格处理404等HTTP状态代码错误;我正在寻找处理实际异常(及其子类)的方法。这样,在我的视图页面中,我可以在适用的地方抛出我自己的异常(例如,如果为必填字段提供了null。)Startup.cs片段:publicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv,ILoggerFactoryloggerFactory,LoanDbContextcontext){loggerFactory.AddConsole(Configuration.GetSection("Logging"));loggerFactory.AddDebug();app.UseStatusCodePages();if(env.IsDevelopment()||env.IsEnvironment("qa")){app.UseDeveloperExceptionPage();app.UseBrowserLink();}else{app.UseExceptionHandler("/Error");}app.UseMiddleware(loggerFactory);//...Configure的其余部分与此问题无关MyExceptionHandler.csusingMicrosoft.AspNetCore.Http;使用Microsoft.EntityFrameworkCore;使用Microsoft.Extensions.Logging;使用系统;使用System.Data.SqlClient;使用System.Threading.Tasks;namespaceMyCompany.MyProject.Helpers{//////可以在其他项目中重复使用的自定义异常处理程序中间件。///publicsealedclassMyExceptionHandler{privatereadonlyRequestDelegate_next;私人只读ILogger_logger;民众MyExceptionHandler(RequestDelegatenext,ILoggerFactoryloggerFactory){_next=next;_logger=loggerFactory.CreateLogger();}publicasyncTaskInvoke(HttpContextcontext){try{await_next(context);}catch(Exceptionex){HandleException(ex);}}//我意识到这个函数看起来毫无意义,但它最终会有更多内容。publicvoidHandleException(Exceptionex){if(exisArgumentExceptionargEx){_logger.LogError(0,argEx,argEx.Message);}elseif(exisInvalidOperationExceptionioEx){_logger.LogError(0,ioEx,"发生无效操作异常。这通常是由数据库调用引起的,该调用期望"+"一个结果,但没有收到或收到多个结果。");}elseif(exisSqlExceptionsqlEx){_logger.LogError(0,sqlEx,$"发生SQL数据库异常。错误编号{sqlEx.Number}");}elseif(exisNullReferenceExceptionnullEx){_logger.LogError(0,nullEx,$"ANullReferenceExceptionoccurred.Source:{nullEx.Source}.");}elseif(exisDbUpdateConcurrencyExceptiondbEx){_logger.LogError(0,dbEx,"尝试更新您的项目时发生数据库错误。这通常是由于其他人修改了项目,因为您加载它。”);}else{_logger.LogError(0,ex,"发生未处理的异常。")}}}}我应该使用我的异常日志记录中间件和app.UseExceptionHandler("/Error")以便middlewarere-throwstheexceptiontothepage?isasnippetusingonlyyourexample.publicasyncTaskInvoke(HttpContextcontext){try{await_next(context);}catch(Exceptionex){HandleException(ex);//re-throwtheoriginalexception//afterloggingtheinformationthrow;}}以上将在记录信息后重新抛出原始异常,以便管道中的其他处理程序将捕获它并执行开箱即用的处理。ASP.NETCore中的源错误处理如何在错误页面中获取异常详细信息?使用IExceptionHandlerPathFeature获取异常和PathpublicIActionResultError(){//获取发生异常的详细信息varexceptionFeature=HttpContext.Features.Get();if(exceptionFeature!=null){//获取异常发生在哪个路由stringrouteWhereExceptionOccurred=exceptionFeature.Path;//获取发生的异常ExceptionexceptionThatOccurred=exceptionFeature.Error;//TODO:做一些有异常的事情//用Serilog记录它?//发送电子邮件、文本、传真或载体?也许以上所有?//无论你做什么,都要小心捕获任何异常,否则你将得到一个空白页面并抛出500}returnView();在ASP.NETCore中使用IExceptionHandlerPathFeature在上面的示例中添加全局错误处理和日志记录到源代码中,他们提到在视图中记录日志,但您已经在自定义处理程序中完成了。渲染错误视图时要特别注意这个小提示。无论您做什么,都要小心捕获任何异常,否则您将得到一个空白页面并抛出500。通过插入管道,您可以避免重新发明框架已经提供的功能,并且还可以管理横切关注点。以上就是C#学习教程的全部内容:异常处理中间件及页面分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: