C# WebApi 异常处理解决方案

下面是关于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技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • C# Directory.GetFiles(string path):获取指定目录下的所有文件路径

    Directory.GetFiles(string path) 是C#中的一个静态方法,它返回指定目录中文件的名称,包括该目录中的所有子目录。它是 DirectoryInfo 类的一个实例方法 GetFiles 的静态等效方法。 方法签名 public static string[] GetFiles(string path); public static …

    C# 2023年4月19日
    00
  • c#入门之类型转换详解

    C#入门之类型转换详解 前言 在程序开发过程中,类型转换是非常常见的操作。在C#中,我们一般使用类型转换符或者Convert类进行类型转换。 本文将介绍C#中常见的类型转换及其使用方法。 类型转换符 类型转换符可以理解为将一个数据类型转换为另一个数据类型的方法,C#中的常用类型转换符如下: +:将非字符串类型转换为字符串类型 -:将整型类型转换为负数 *:将…

    C# 2023年6月6日
    00
  • CefSharp自定义缓存实现

    大家好,我是沙漠尽头的狼。 上文介绍了《C#使用CefSharp内嵌网页-并给出C#与JS的交互示例》,本文介绍CefSharp的缓存实现,先来说说添加缓存的好处: 提高页面加载加速:CefSharp缓存可以缓存已经加载过的页面和资源,当用户再次访问相同的页面时,可以直接从缓存中加载,而不需要重新下载和解析页面和资源,从而加快页面加载速度。 减少网络流量:使…

    C# 2023年5月4日
    00
  • C#实现属于自己的QQ截图工具

    下面是详细讲解如何实现属于自己的QQ截图工具的攻略。 准备工作 在开始之前,你需要准备以下资源: C#编程语言基础知识 Visual Studio开发工具 Windows窗口操作相关的API知识 截图相关的API知识 实现步骤 创建Windows窗体应用程序项目。 在窗体上添加一个按钮控件,命名为“截屏”。 添加按钮的Click事件响应方法,并在该方法中编写…

    C# 2023年6月6日
    00
  • asp.net(c#)不可访问,因为它受保护级别限制

    当在 ASP.NET(C#)应用程序中使用类成员、方法、或属性时,有时候会出现“不可访问,因为它受保护级别限制”的异常。这是因为在 C# 中每个类成员、方法、或属性都有一个访问修饰符,它用于限制其他代码中对它的访问权限。 以下是几种可能的修饰符: public: 所有代码都可以访问它 private: 只有类内部的代码能够访问它 protected: 只有类…

    C# 2023年5月15日
    00
  • 浅析C#静态类,静态构造函数,静态变量

    C# 静态类,静态构造函数,静态变量 静态类 在C#中,静态类是一种只包含静态成员的类。不能被实例化,也不能被继承。常用于定义全局函数或者全局变量。 定义方式: static class MyStaticClass { // 静态成员 public static void MyStaticMethod() { Console.WriteLine("…

    C# 2023年6月8日
    00
  • C# XML字符串包含特殊字符的处理转换方法小结

    C#XML字符串包含特殊字符的处理转换方法小结 当我们需要在C#中处理XML字符串时,有时候会碰到字符串中包含特殊字符而导致解析出错的情况。在这种情况下,我们需要对字符串进行一定的转换处理。本文将总结一些常见的处理方法,并提供两条示例来说明。 方法一:使用XmlDocument对象进行处理 可以使用C#的XmlDocument对象来解析XML文档并处理XML…

    C# 2023年5月15日
    00
  • ASP.Net Core基于ABP架构配置To Json序列化

    ASP.NET Core是一个跨平台的开源框架,它已成为web应用程序开发的主流,而ABP则是一种ASP.NET Core应用程序架构,有助于开发大型的多租户应用程序。在ABP架构中,To Json序列化是一种常用的配置方式,可以将.NET对象转换为JSON格式的字符串。 下面是ASP.Net Core基于ABP架构配置To Json序列化的完整攻略: 首先…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部