Solidność - obsługa błędów
Solidność zapewnia różne funkcje do obsługi błędów. Generalnie, gdy wystąpi błąd, stan jest przywracany do pierwotnego stanu. Inne kontrole mają na celu zapobieganie nieautoryzowanemu dostępowi do kodu. Poniżej przedstawiono niektóre z ważnych metod używanych w obsłudze błędów -
assert(bool condition)- W przypadku niespełnienia warunku to wywołanie metody powoduje nieprawidłowy kod operacji i wszelkie zmiany dokonane w stanie są cofane. Tę metodę należy stosować w przypadku błędów wewnętrznych.
require(bool condition)- W przypadku niespełnienia warunku to wywołanie metody powraca do pierwotnego stanu. - Tę metodę należy stosować w przypadku błędów w danych wejściowych lub komponentach zewnętrznych.
require(bool condition, string memory message)- W przypadku niespełnienia warunku to wywołanie metody powraca do pierwotnego stanu. - Tę metodę należy stosować w przypadku błędów w danych wejściowych lub komponentach zewnętrznych. Zapewnia opcję dostarczenia niestandardowej wiadomości.
revert() - Ta metoda przerywa wykonywanie i przywraca wszelkie zmiany wprowadzone do stanu.
revert(string memory reason)- Ta metoda przerywa wykonywanie i przywraca wszelkie zmiany wprowadzone do stanu. Zapewnia opcję dostarczenia niestandardowej wiadomości.
Przykład
Wypróbuj poniższy kod, aby zrozumieć, jak działa obsługa błędów w Solidity.
pragma solidity ^0.5.0;
contract Vendor {
address public seller;
modifier onlySeller() {
require(
msg.sender == seller,
"Only seller can call this."
);
_;
}
function sell(uint amount) public payable onlySeller {
if (amount > msg.value / 2 ether)
revert("Not enough Ether provided.");
// Perform the sell operation.
}
}
Gdy wywoływana jest funkcja Revert, zwraca dane szesnastkowe zgodnie z poniższymi instrukcjami.
Wynik
0x08c379a0 // Function selector for Error(string)
0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset
0x000000000000000000000000000000000000000000000000000000000000001a // String length
0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data