零点课堂 | 如何设计区块链中的异常处理机制(1)-零点财经

零点课堂 | 如何设计区块链中的异常处理机制(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的异常处理机制,支持嵌套。如果异常没有在当前被捕获上,则会沿着调用栈继续往外抛出,直到最终被捕获,或程序因该异常无捕获而终止执行。

如何设计区块链中的异常处理机制
本文由 零点财经 作者:tao 发表,其版权均为 零点财经 所有,文章内容系作者个人观点,不代表 零点财经 对观点赞同或支持。如需转载,请注明文章来源。
分享生成图片
69

发表回复

零点课堂 | 如何设计区块链中的异常处理机制(1)

2021-05-31 11:18:46

什么是异常?

异常是指在程序运行的过程中发生的一些不正常事件。如除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的异常处理机制,支持嵌套。如果异常没有在当前被捕获上,则会沿着调用栈继续往外抛出,直到最终被捕获,或程序因该异常无捕获而终止执行。

如何设计区块链中的异常处理机制