零点课堂 | 如何设计区块链中的异常处理机制(1)
什么是异常?
异常是指在程序运行的过程中发生的一些不正常事件。如除0溢出,数组下标越界,需要进行动态调用的合约不存在等。
设计良好的程序应该在程序异常发生时提供处理这些异常的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。例如,一笔支付金额不足或支付失败时,需要恢复继续执行其他操作等。
异常的处理机制
在异常机制引入之前,常利用if-else的方式处理异常。然而这种处理异常方式比较麻烦,同一个异常或者错误如果在多个地方出现,那么在每个地方都要做相同处理,形成很多功能相同的冗余代码。
现在常用的方式,采用try-catch机制来处理异常,其基本原理如下:
try{
// 监控区域,执行可能产生异常的代码
…
}catch(异常类型){
// 捕获,进行异常处理操作
…
}finally{
// 善后处理,无论是否发生异常,代码都会执行
…
}
给大家举几个特殊场景的情况:
如果只有try-catch结构,缺少finally结构时。
1) 若在catch段执行过程中再发生异常,则会直接对外抛出该新异常,并结束退出该段执行。
try
//….
catch
//….
throw error // This new error will be throwed outer layer
若只有try-finally结构,缺少catch结构时。
2)若在finally段执行过程中再发生异常,则会直接对外抛出该新异常,并结束该段执行。
try
//…
finally
//…
throw error //This error will be throwed outer layer
若try和finally段中,都包含return语句时。
3)最终会执行finally段的return, 但是返回值根据不同语言的实现,有的能返回finally的值,有的是返回try段的值。故在实际中,并不是很鼓励在finally段使用return指令。
try
//..
return x
catch
//…
return y
finally
//…
return z
异常的传递
try-catch的异常处理机制,支持嵌套。如果异常没有在当前被捕获上,则会沿着调用栈继续往外抛出,直到最终被捕获,或程序因该异常无捕获而终止执行。