下面是关于C# WebApi异常处理的完整攻略:
1. 异常分类
- 程序完成预期业务逻辑,但无法继续执行下去,抛出了异常,如空引用异常、下标越界异常等。
- 业务逻辑处理不符合预期或不符合要求,可以抛出自定义异常。
2. 异常处理方案
- 通过自定义过滤器来实现统一的异常处理。
2.1 自定义Exception类
首先定义一个自定义的异常类,需要继承自Exception类,可以在自定义的异常类中添加适合自己的属性和方法,来更好地描述异常。
public class MyException : Exception
{
//异常描述
public string Message { get; set; }
//异常代码
public int Code { get; set; }
//重写Exception类的Message属性
public override string Message => $"MyException - Code: {this.Code}, Message: {this.Message}";
public MyException(int code, string message)
{
this.Message = message;
this.Code = code;
}
}
2.2 自定义异常处理过滤器
自定义异常过滤器需要继承自"System.Web.Http.Filters.ExceptionFilterAttribute"类,并覆盖其中的"OnException"方法。
在方法中实现异常的处理,可以通过异常是否是自定义异常来判断是否需要记录异常日志或其他操作,同时也可以根据需要进行异常的格式化,然后返回给客户端。
public class MyExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
var exception = actionExecutedContext.Exception;
var result = new HttpResponseMessage();
//处理自定义异常
if(exception is MyException ex)
{
//返回适合客户端的自定义异常格式信息
result.Content = new StringContent(JsonConvert.SerializeObject(
new { ErrorCode = ex.Code, ErrorMsg = ex.Message }
), Encoding.UTF8, "application/json");
result.StatusCode = HttpStatusCode.InternalServerError;
}
//处理其他异常
else
{
//记录一些错误信息或将错误抛出,这里忽略,并返回适合客户端的异常格式信息
result.Content = new StringContent(JsonConvert.SerializeObject(
new { ErrorCode = -1, ErrorMsg = exception.Message }
), Encoding.UTF8, "application/json");
result.StatusCode = HttpStatusCode.InternalServerError;
}
actionExecutedContext.Response = result;
}
}
2.3 将自定义异常过滤器添加到全局配置中
要让WebApi应用程序识别到我们定义的MyExceptionFilter过滤器,需要在全局配置文件中添加该过滤器。使用"config.Filters.Add()"来添加该异常处理过滤器。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//跨域配置
config.EnableCors();
//WebApi路由配置
config.MapHttpAttributeRoutes();
//添加自定义异常过滤器
config.Filters.Add(new MyExceptionFilter());
}
}
3. 示例
3.1 抛出自定义异常的示例
[RoutePrefix("api/user")]
public class UserController : ApiController
{
[HttpGet]
[Route("info")]
public IHttpActionResult GetUserInfo(int userId)
{
if(userId == 0)
{
//抛出自定义异常
throw new MyException(1, "userId不能为0");
}
//根据userId查询用户信息...
return Ok();
}
}
3.2 抛出系统异常的示例
[RoutePrefix("api/test")]
public class TestController : ApiController
{
[HttpGet]
[Route("error")]
public IHttpActionResult TestError()
{
//获取未定义的类型对象会抛出异常
var obj = Type.GetType("InvalidType").GetMethod("test");
obj.Invoke(null, null);
return Ok();
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# WebApi 异常处理解决方案 - Python技术站