自定义异常结果的处理

时间:2022-05-21 06:09:17

标签:

1、常规的异常处理

统一的异常处理,把正确的信息返回给调用者很重要,可以让接口开发人员或者用户,了解具体的原因所在,这样可以得到有效的错误处理。

参考微信API的处理,微信API,对于调用都有一个错误信息返回,不会直接裸露未经处理的异常,因此它们都是经过了一定的拦截处理,然后把错误信息包装提供给接口调用方的。如下是微信的一些接口处理错误。

错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误): {"errcode":40013,"errmsg":"invalid appid"}

我们根据自己的需要,定义了一个统一的错误信息实体类,如下所示。

/// <summary> /// 接口返回的错误信息 /// </summary> public class BaseResultJson { /// <summary> /// 错误代码 /// </summary> public int errcode { get; set; } /// <summary> /// 如果不成功,返回的错误信息 /// </summary> public string errmsg { get; set; } /// <summary> /// 是否成功 /// </summary> public bool success { get; set; } }

这样我们就可以把拦截到的错误信息,转换为这样一个方便使用的实体类信息了。

拦截Web API的调用异常,一般可以结合Try Catch的方法,以及异常拦截器进行处理,如下是主动抛出的一些异常信息处理。

//如果没有通过,则抛出异常,由异常过滤器统一处理 if (!result.success) { throw new MyApiException(result.errmsg, result.errcode); }

其中MyApiException是自定义的一个异常信息,用来承载自定义错误信息的异常类。

异常拦截器,我们在Web API里面可以通过Attribute这种标签特性进行处理,,如下是我在Web API的基类里面定义了一个异常处理器。

/// <summary> /// 所有接口基类 /// </summary> [ExceptionHandling] public class BaseApiController : ApiController

这个特性对象的定义,它的代码如下所示。

/// <summary> /// API自定义错误过滤器属性 /// </summary> public class ExceptionHandlingAttribute : ExceptionFilterAttribute { /// <summary> /// 统一对调用异常信息进行处理,返回自定义的异常信息 /// </summary> /// <param>HTTP上下文对象</param> public override void OnException(HttpActionExecutedContext context) { //自定义异常的处理 MyApiException ex = context.Exception as MyApiException; if (ex != null) { throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) { //封装处理异常信息,返回指定JSON对象 Content = new StringContent(new BaseResultJson(ex.Message, false, ex.errcode).ToJson()), ReasonPhrase = "Exception" }); } //记录关键的异常信息 Debug.WriteLine(context.Exception); //常规异常的处理 string msg = string.IsNullOrEmpty(context.Exception.Message) ? "接口出现了错误,请重试或者联系管理员" : context.Exception.Message; throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent(msg), ReasonPhrase = "Critical Exception" }); } }

根据这些代码,我们就可以实现对调用异常的统一封装处理,让它给我们返回统一的对象信息了,如下是其中一个调用异常,转换为自定义异常信息后的结果输出。

{"errcode":404,"errmsg":"请求的资源不支持 http 方法“POST”。","success":false}

这样我们在处理Web API的返回结果的时候,可以先处理它的异常信息,具体的处理代码如下所示。

HttpHelper helper = new HttpHelper(); helper.ContentType = "application/json"; string content = helper.GetHtml(url, postData, true); VerifyErrorCode(content); T result = JsonConvert.DeserializeObject<T>(content); return result;

我们在上面红色部分的代码就是先处理异常定义信息,如果有这些异常,我们可以在界面中进行异常处理显示了。

例如,如果自定义异常存在,我们转换后,把对应的信息显示出来,重新抛出异常即可。