header-langage
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
扫码下载APP

Solidity极简入门|第三十讲:Try Catch

2022-10-17 22:00
阅读本文需 7 分钟
总结 AI 总结
看总结 收起
原文标题:《 Solidity 极简入门: 30. Try Catch 》 
原文作者:0xAA 


我最近在重新学 solidity,巩固一下细节,也写一个「Solidity 极简入门」,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。


所有代码和教程开源在 github:github.com/AmazingAng/WTFSolidity


try-catch 是现代编程语言几乎都有的处理异常的一种标准方式,solidity0.6 版本也添加了它。这一讲,我们将介绍如何利用 try-catch 处理智能合约中的异常。


try-catch


在 solidity 中,try-catch 只能被用于 external 函数或创建合约时 constructor(被视为 external 函数)的调用。基本语法如下:



其中 externalContract.f() 时某个外部合约的函数调用,try 模块在调用成功的情况下运行,而 catch 模块则在调用失败时运行。


如果调用的函数有返回值,那么必须在 try 之后声明 returns(returnType val),并且在 try 模块中可以使用返回的变量;如果时创建合约,那么返回值是新创建的合约变量。



另外,catch 模块支持捕获特殊的异常原因:



try-catch 实战   


OnlyEven


我们创建一个外部合约 OnlyEven,并使用 try-catch 来处理异常:  



OnlyEven 合约包含一个构造函数和一个 onlyEven 函数。


构造函数有一个参数 a,当 a=0 时,require 会抛出异常;当 a=1 时,assert 会抛出异常;其他情况均正常。onlyEven 函数有一个参数 b,当 b 为奇数时,require 会抛出异常。


处理外部函数调用异常


首先,在 TryCatch 合约中定义一些事件和状态变量:



SuccessEvent 是调用成功会释放的事件,而 CatchEvent 和 CatchByte 是抛出异常时会释放的事件,分别对应 require/revert 和 assert 异常的情况。even 是个 OnlyEven 合约类型的状态变量。


然后我们在 execute 函数中使用 try-catch 处理调用外部函数 onlyEven 中的异常:



当运行 execute(0) 的时候,因为 0 为偶数,没有异常抛出,调用成功并释放 SuccessEvent 事件;当运行 execute(1) 的时候,因为 1 为偶数,异常抛出,调用失败并释放 CatchEvent 事件。


处理合约创建异常


这里,我们利用 try-catch 来处理合约创建时的异常。只需要把 try 模块改写为 OnlyEven 合约的创建就行:



大家可以运行一下 executeNew(0),executeNew(1),executeNew(2),看看会有什么不同。


总结


在这一讲,我们介绍了如何使用 try-catch 来处理智能合约运行中的异常:


只能用于外部合约调用和合约创建。

如果 try 执行成功,返回变量必须声明,并且与返回的变量类型相同。  


原文链接


点击了解律动BlockBeats 在招岗位


欢迎加入律动 BlockBeats 官方社群:

Telegram 订阅群:https://t.me/theblockbeats

Telegram 交流群:https://t.me/BlockBeats_App

Twitter 官方账号:https://twitter.com/BlockBeatsAsia

举报 纠错/举报
本平台现已全面集成Farcaster协议, 如果您已有Farcaster账户, 可以登录 后发表评论
选择文库
新增文库
取消
完成
新增文库
仅自己可见
公开
保存
纠错/举报
提交