Trong Solidity có ba cách để xử lý và quăng lỗi: require
, assert
và revert
.
Require
Là câu lệnh giúp quăng lỗi, dừng thực thi và revert mọi sự thay đổi nếu có một điều kiện nào đó không thỏa.
Ví dụ:
Nếu ta gọi hàm sayHiToKwan
với đối số là "Kwan"
thì nó sẽ trả về "Hi"
. Tuy nhiên, nếu ta gọi hàm này với các đối số khác thì nó sẽ quăng lỗi và hiển thị chuỗi "You are not Kwan"
(chuỗi này là optional).
Điểm hay của require
là nó có thể trả lại Gas cho caller nếu xảy ra lỗi.
Important
Luôn thêm message vào câu lệnh
require
.
Assert
Tương tự với require
nhưng trả về lỗi ở dạng Panic(uint256)
thay vì Error(string)
. Chúng ta thường dùng assert
để kiểm tra các invariant (là các giá trị không thay đổi giá trị trong chương trình).
Trong ví dụ bên dưới, assert
được dùng để đảm bảo balance của contract luôn là 0
:
Trong trường hợp xảy ra lỗi, gas sẽ không được hoàn trả.
Revert
Chúng ta có thể quăng các custom error nếu sử dụng revert
. Sử dụng custom error có thể giúp giảm hao phí gas cũng như là cho phép trả về những thông tin hữu ích hơn.
Chẳng hạn trong contract bên dưới, lỗi có prefix là tên contract. Điều này giúp cho quá trình truy tìm lỗi dễ dàng hơn:
Cũng tương tự với require
, gas cũng sẽ được trả lại cho caller nếu xảy ra lỗi.
Seealso
Tham khảo thêm về hàm
keccak256
: Solidity - Keccak256.