Trong Solidity có ba cách để xử lý và quăng lỗi: require, assertrevert.

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ụ:

function sayHiToKwan(string memory _name) public returns (string memory) {
	// Compares if _name equals "Kwan". Throws an error and exits if not true.
	// (Side note: Solidity doesn't have native string comparison, so we
	// compare their keccak256 hashes to see if the strings are equal)
	require(keccak256(abi.encodePacked(_name)) == keccak256(abi.encodePacked("Kwan")), "You are not Kwan");
	
	// If it's true, proceed with the function:
	return "Hi!";
}

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:

contract ThrowMe {   
    function assertExample() public pure {
        assert(address(this).balance == 0);
	  // Do something.
    }
}

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:

contract ThrowMe {   
    // Custom error
    error ThrowMe_BadInput(string errorMsg, uint inputNum);
 
    function revertExample(uint input) public pure {
        if (input < 1000 ) {
	    revert ThrowMe_BadInput("Number must be an even number greater than 999",  input);
       }
 
      if (input < 0) {
          revert("Negative numbers not allowed");
      }
    }
}

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.