Error
The syscalls of ckb
are influenced by the Unix syscall convention, where a return value of 0
usually indicates success and any non-zero value indicates failure. ()
However, in Rust, it's more convenient to handle errors using Result<T, E>
. Therefore, most functions in ckb-std
return a Result
, with errors represented by the SysError
enum.
Note that the variants of SysError
do not correspond one-to-one with the raw syscall return codes.
For example, the spawn
syscall may return 3
, but in ckb-std
, this error is represented as Encoding
.
Syntax
#[derive(Eq, PartialEq, Debug, Clone, Copy)]
pub enum SysError {
IndexOutOfBound,
ItemMissing,
LengthNotEnough(usize),
Encoding,
WaitFailure,
InvalidFd,
OtherEndClosed,
MaxVmsSpawned,
MaxFdsCreated,
#[cfg(feature = "type-id")]
TypeIDError,
Unknown(u64),
}
Constants
IndexOutOfBound
: Index out of bound.
Often used as a signal for the end of iteration. In ckb_std::high_level
, iterators are recommended, so this is rarely encountered.
ItemMissing
: Field is missing for the target.
Typically occurs when trying to read a non-existent field related to a Type Script in ckb_std::syscalls
.
In ckb_std::high_level
, it usually returns Option::None
.
LengthNotEnough(usize)
: Buffer length is not enough, error contains actual data length.
This is usually handled automatically in ckb_std::high_level
by allocating enough memory and retrying the read.
Encoding
: Data encoding error. Normally not encountered during typical development.
WaitFailure
: Failed to wait. Its value is 5.
InvalidFd
: Invalid file descriptor.
OtherEndClosed
: Reading from or writing to file descriptor failed due to other end closed.
MaxVmsSpawned
: Max vms has been spawned.
MaxFdsCreated
: Max fds has been spawned.
TypeIDError
: Type ID Error.
Unknown(u64)
: Unknown syscall error number. ckb-vm 可能会返回一些未知的值,一般会存进这里。
Remarks
The errors WaitFailure
, InvalidFd
, OtherEndClosed
, MaxVmsSpawned
, and MaxFdsCreated
typically only occur when executing functions related to spawn
.
Example
See the example at rust-script-examples/error
.
This is a Lock Script that uses args[0]
to select which error type to trigger.
You can verify the behavior with the tests in tests/src/test_error.rs
.