Пользовательские исключения в Solidity

В солидности есть ли способ скинуть 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  

}

Ответы (3)

В настоящее время в коде виртуальной машины Ethereum нет пользовательских исключений. Все условия отказа - «нет газа», поскольку исключение моделируется как потребление всего оставшегося газа.

eth.debug.traceTransaction API может дать вам некоторое представление , но, насколько мне известно, на данный момент он не реализует удобочитаемые механизмы ошибок.

Технически throwэто приводит к ошибке «Недопустимый прыжок», а не к ошибке отсутствия газа, но результат тот же.
Это странно. Я имею в виду, какой бы ни была причина сбоя транзакции, пользователь всегда получит Invalid Jump. Становится довольно неудобно для наших пользователей.
@PrashantPrabhakarSingh: это известная проблема. Первоначальный протокол был разработан с учетом простоты, и я верю, что в будущих версиях Ethereum это будет учтено.
Обратите внимание, что это ответ 2016 года.

Начиная с 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()
      }