异常,异常处理介绍

我被代码海扁 @codebeatme-s @103466775
阅读 3:52·字数 1162·发布 

异常

异常用来表示一种非正常情况,他未必是一个错误,但却足以影响当前的工作流程。在一台计算机中,异常可能来自于硬件,操作系统,或某种语言,本节中我们只讨论最后一种情况。

在异常发生时确保重要的代码始终被执行
异常的发生通常伴随着控制权的转移,这表示一部分本应被执行的代码可能被忽略,如果这些代码包含了重要的操作,比如资源的释放,那么请考虑进行调整,以确保他们始终被执行。

抛出异常

对于支持异常的语言,其自身具有的函数或方法可能已经编写了抛出异常的代码,而开发人员可以对自己定义的函数或方法实施同样的操作。一旦异常被抛出,控制权将转移至捕获该异常的代码处。

什么情况下可以抛出异常?
如果你希望,那么任何情况下都可以抛出一个异常,但这种行为需要针对真正无法处理的问题,业务逻辑本身应该具备一定的纠错能力,当问题导致业务无法继续时,可用异常来通知可能的调用方。

比如,当某个无关紧要的参数丢失时,我们可以为其指定一个默认值,只要整个逻辑的可靠性没有被破坏。

在下面的 C# 函数Divide中,如果除数为0,我们会抛出一个异常。

*.cs
// 函数 Divide,实现除法,会检查除数是否有问题
int Divide(int dividend, int divisor)
{
	// 除数不能为 0,否则抛出异常
	if (divisor == 0)
		throw new Exception("参数 divisor 不能为 0!");

return dividend / divisor; }

捕获异常

在处理异常之前,需要圈定一段代码,以捕获其中可能被抛出的异常,对于捕获到的异常,你可以根据其类型以及包含的数据,给予相应的处理。

关于异常的类型,除了语言预先包括的,也可以自行定义。

什么是未捕获异常?
顾名思义,未捕获异常是指被抛出但未被捕获的异常,未捕获异常会尝试传播至上一级调用方,如果所有代码均未捕获他,那么系统或语言运行环境将对其进行默认处理。

什么情况下需要捕获异常?
当代码抛出的异常,严重到影响业务逻辑的正常运作,并且你已经确定了可行的应对方案时,就可以对其进行捕获。

下面的try…catch语句将捕获函数Divide抛出的异常,并将显示异常信息作为处理方式。

*.cs
// 捕获和处理异常
try
{
	// 除数为 0,将抛出异常
	Divide(7, 0);
}
catch (Exception err)
{
	// 简单的显示异常的信息
	Console.WriteLine($"糟糕,出现一个异常!{err.Message}");
}
糟糕,出现一个异常!参数 divisor 不能为 0!

全局异常处理

在一些语言中,对异常进行全局处理是可能的,你将集中处理程序中所有未被捕获的异常。看上去这带来了很大的便利,但该方式很少能解决具体问题,通常只是进行异常的记录工作,因为距离异常产生的位置可能已经很远,想通过编写代码来实施补救会比较困难。

当然,情况并非一成不变,当希望对某一类异常进行统一处理时,全局处理将是不错的选择。比如,我们希望在 Web 服务器出现某种异常时,为用户展示一个特定的页面。

源码

exceptions.cs·codebeatme/programming·GitHub