В солидности есть ли способ скинуть custom Exceptions
вместе с сообщениями об ошибках? Я использую throw
для предотвращения дальнейшего выполнения моего кода, но это всегда приводит к invalid JUMP
(в консоли geth, при отладке) и Intrinsic gas too low
(в Mist). Могу ли я иметь собственные сообщения об ошибках?
Например, можем ли мы изменить transfer(..)
функцию, чтобы она выдавала сообщение об ошибке, account balance is low
когда баланс отправителя меньше суммы, которую он хочет перевести?
function transfer(address _to, uint256 _value) {
if (balanceOf[msg.sender] < _value) // Check if the sender has enough
{
throw;
// some code to display "account balance is low" to user instead of 'Intrinsic Gas too low'
}
balanceOf[msg.sender] -= _value; // Subtract from the sender
balanceOf[_to] += _value; // Add the same to the recipient
Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took
}
В настоящее время в коде виртуальной машины Ethereum нет пользовательских исключений. Все условия отказа - «нет газа», поскольку исключение моделируется как потребление всего оставшегося газа.
eth.debug.traceTransaction API может дать вам некоторое представление , но, насколько мне известно, на данный момент он не реализует удобочитаемые механизмы ошибок.
Начиная с Solidity 0.4.22, можно добавлять сообщения об ошибках с помощью require
и assert
. throw
устарела. Это заняло много времени, но, наконец, возможно добавление оператора ошибки. ссылка
Образец контракта с использованием этого проиллюстрирован как:
pragma solidity ^0.4.23;
contract TestExceptionHandling{
uint public a ;
constructor(uint _a) public{
a= _a;
}
function increaseA(uint b) public{
require(b > a, 'new value must be greater than a');
if (b > 50){
revert('Very large value');
}
a = b;
}
}
Я не уверен, как поймать это сообщение об ошибке в DAPP и показать сообщение об ошибке в пользовательском интерфейсе. Обновлю ответ, когда я изучу это.
На данный момент вы можете выдать такую ошибку. Я не уверен, когда он был добавлен:
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
/// Write custom Error!
error MyCustomError();
Это 3 "///". "Написать пользовательскую ошибку!" это сообщение, которое будет показано пользователю
затем вызовите его в своей функции
if (thisIsNotSatisfied){
revert MyCustomError()
}
Тьяден Хесс
throw
это приводит к ошибке «Недопустимый прыжок», а не к ошибке отсутствия газа, но результат тот же.Прашант Прабхакар Сингх
Invalid Jump
. Становится довольно неудобно для наших пользователей.Микко Отамаа
Микко Отамаа