异常处理是每个软件应用程序的一个关键过程。想象一下,一个用户经常看到奇怪的错误或一个不断崩溃的应用程序。当 异常仍未被处理时,你的应用程序很快就会走向灭亡。幸运的是,只要正确地处理异常,它们是可以恢复的,在你继续阅读时,你会了解如何恢复。
这篇文章主要介绍了用C# Web API的全局异常处理程序来处理异常,另外。
- 什么是C#中的异常和错误
- 处理异常的方法
C#中的错误与异常
错误和异常是开发人员经常互换的术语,但这两者有明显的区别。当系统资源缺乏或不可用时,就会出现错误。异常是由于程序中的问题而产生的。
为了消除任何混淆,这里对这两者之间的区别进行了更详细的描述。
C#中的错误
C#中的错误异常是程序员无法处理的复杂故障,因为它们是由缺乏或不可用的资源引起的--内存不足、堆栈溢出和许多其他问题。由于程序员无法使用C#程序处理错误,这些错误被认为是不可恢复的。
C#中的异常处理
异常通常是由于C#程序中的问题而发生的。需要特殊处理或处理的异常情况会导致这些问题。与错误不同,异常是可以恢复的。在处理 C#中的异常中,程序员使用try、catch和block方法。
如何在C# Web API中处理异常和全局异常处理程序
掌握了错误和异常的区别,现在是时候学习如何处理这些异常了。
在我们的讨论中,让我们把重点放在异常处理上,用 ASP.NET Web API.ASP.NET是由微软开发的,用于建立动态网络应用程序或网站,是一个开源的网络框架。这个框架使用C#编程语言运行。
回到异常处理,当Web API中抛出一个异常时,该异常被翻译成HTTP响应,显示状态代码500--"内部服务器错误"。你如何处理这个异常?
HttpError
HttpError对象提供了一种向客户端返回错误信息和消息的方法。为了实现这一点,你需要放置CreateErrorResponse来创建一个HttpError对象的实例。然后它作为HttpResponseMessage对象返回。
public HttpResponseMessage Get([FromODataUri] int key)
{
Product data = context.Product.Where(k => k.Id == key).FirstOrDefault();
if (data == null)
{
string message = string.Format("No Product found with ID = {0}", key);
return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
}
return Request.CreateResponse(HttpStatusCode.OK, data);;
}
HttpResponseException
HttpResponseException使程序能够向客户端返回HttpResponseMessage。这个异常返回在异常构造函数中指定的HttpStatusCode。
throw new HttpResponseException(HttpStatusCode.NotFound);
或者构造整个响应消息,以便对响应进行更多的控制。
public Product Get([FromODataUri] int key)
{
Product data = context.Product.Where(k => k.Id == key).FirstOrDefault();
if (data == null)
{
var response = newHttpResponseMessage(HttpStatusCode.NotFound)
{
Content = newStringContent(string.Format("No Product found with ID = {0}", key)),
ReasonPhrase = "Product Not Found"
};
throw new HttpResponseException(response);
}
return data;
}
全局异常过滤器
有了异常过滤器,你可以通过编写异常过滤器类来定制你的Web API如何处理几个异常。异常过滤器捕捉Web API中未处理的异常。当一个动作方法抛出一个未处理的异常时,过滤器的执行就会发生。然而,异常过滤器并不捕捉HttpresponseExecution,因为后者被设计为返回HttpResponse。
一旦控制器动作方法抛出一个未处理的异常,而这个异常不是HttpResponseExeption,你就可以使用该异常过滤器。
namespace WebAPITest
{
using System.Net;
using System.Net.Http;
using System.Web.Http.Filters;
public class CustomExceptionFilter: ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContextactionExecutedContext)
{
string exceptionMessage = string.Empty;
if (actionExecutedContext.Exception.InnerException == null)
{
exceptionMessage = actionExecutedContext.Exception.Message;
}
else
{
exceptionMessage = actionExecutedContext.Exception.InnerException.Message;
}
//We can log this exception message to the file or database.
var response = newHttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = newStringContent(“An unhandled exception was thrown by service.”),
ReasonPhrase = "Internal Server Error.Please Contact your Administrator."
};
actionExecutedContext.Response = response;
}
}
}
全局异常处理程序
现在你知道了,异常过滤器可以捕获未处理的异常。然而,有一些异常是从动作外部引发的,比如。异常过滤器中的错误,与路由有关的异常,消息处理类中的异常,控制器构造函数中的异常。
当这种情况发生时,你将需要异常处理程序。幸运的是,Web API 2可以在你的C# Web API中实现一个全局的异常处理程序。Web API提供了 "ExceptionHandler",它实现了IExceptionHandler。为了实现ExceptionHandler,你可以使用下面的代码。
namespace WebAPITest
{
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http.ExceptionHandling;
using System.Web.Http.Results;
public class GlobalExceptionHandler: ExceptionHandler
{
public async override TaskHandleAsync(ExceptionHandlerContext context, CancellationTokencancellationToken)
{
// Access Exception using context.Exception;
const string errorMessage = "An unexpected error occured";
var response = context.Request.CreateResponse(HttpStatusCode.InternalServerError,
new
{
Message = errorMessage
});
response.Headers.Add("X-Error", errorMessage);
context.Result = new ResponseMessageResult(response);
}
}
}
**注意:**该异常处理程序应该被注册。Web API有一个现有的异常处理程序类,但不支持多个异常处理程序。因此,你需要用你的自定义异常处理程序类替换现有的类。
用Retrace查找和处理C#异常
Retrace是一个应用性能监控(APM)解决方案,集多种工具于一身,包括执行代码级服务器监控、性能分析、应用监控、错误跟踪等。
Retrace的一个特殊功能是 错误监控.有了Retrace,你可以在你的应用程序中收集C#异常,而不影响你的代码。这是真的!你可以在不改变代码的情况下捕获异常。
更棒的是,Retrace适用于所有ASP.NET应用程序,并可与MVC、WCF、Web API、.NET Core等一起运行。
在你的代码中找到每一个异常。 现在开始您的免费试用
关于Charris Herrera
- 5大Node.js性能测量指标 - 2021年8月31日
- 如何用C# Web API处理全局异常处理程序 - 2021年8月18日
- 如何使用Visual Studio分析器对性能进行故障诊断- 2021年8月2日
- 顶级Visual Studio剖析工具 - 2021年7月16日
- 对网络服务器进行负载测试的最佳方法 - 2021年7月2日