异常处理,也可以做得很优雅。
一、前言
异常处理的重要性,老司机都清楚。
这篇文章,我们来理一下Dotnet Core异常处理的几种方式。
- Try Catch方式
- Exception Filter方式
- 内建的异常处理中间件
- 自定义的异常处理中间件
这是目前使用比较多的几种方式。其中,第1、2种其实算是一种,是C#两个语言版本的东西。
为了防止不提供原网址的转载,特在这里加上原文链接:https://www.cnblogs.com/tiger-wang/p/13562817.html
二、Try Catch方式这是最通常使用的一种方式。
看例子:
[HttpGet] public IActionResult Get() { try { List<string> example_list = null; var item_count = example_list.Count(); return Ok(item_count); } catch (Exception ex) { return StatusCode(HttpContext.Response.StatusCode, ex.Message); } }
有时候,我们可能需要处理多种异常。
catch (Exception ex) { if(ex.InnerException == null) return StatusCode(HttpContext.Response.StatusCode, "error"); else return StatusCode(HttpContext.Response.StatusCode, "other error"); }
在C# 6以后,Try Catch加了一个过滤Exception Filter语法,可以在catch后跟一个条件语句。上面这个catch可以写为:
catch (Exception ex) when (ex.InnerException == null) { return StatusCode(HttpContext.Response.StatusCode, "error"); } catch (Exception ex) { return StatusCode(HttpContext.Response.StatusCode, "other error"); }
在这个语法中,when后面是一个bool的判断,为true则进入catch块,为false则跳过。
在C#中,异常是从内向外逐层查找处理程序的,随着查找层数的增加,性能会逐渐降低。
概念上,try块的运行效率和不加try块的性能差不多,可以认为基本一致;但catch块的性能会差很多。所以一般来说,一个基本的原则是,不要把try、catch作为程序的逻辑。
但是,如果我们需要又需要记录这个异常,该怎么办?
这时候,就可以利用Exception Filter语法。
看代码:
[HttpGet] public IActionResult Get() { try { List<string> example_list = null; var item_count = example_list.Count(); return Ok(item_count); } catch (Exception ex) when (log(ex)) { } return StatusCode(HttpContext.Response.StatusCode, "error"); } private bool log(Exception ex) { Debug.Print(ex.Message); return false; }
在这个代码中,when条件后跟了一个返回bool的方法。我们可以在这个方法中进行异常的记录处理,然后返回false。
为什么要返回false呢?是因为我们要记录异常,但为了性能的考虑,不希望代码进入到catch块。返回false后,程序执行了log方法,却又没进入到catch块。
当然,如果你想进入到catch块,那返回true就可以了。
嗯。这一段能看明白就行了,这不算是一个常规的解决办法,只能算一个旁门的小技巧。
三、内建的异常中间件内建的异常处.........