Buat Custom Error Di Rust

Bulan ini lagi jadi bulan ngulik bahasa yang lagi naik daun yaitu Rust, ada beberapa topik menarik di rust yang membuat saya pengen ngulik bahasa ini. Pertama yaitu konsep ownership dan borrowing nya, dan lagi yang saya ulik beberapa hari terakhir ialah custom error. Dan berikut saya rangkum catatan kecil tentang hasil belajarnya.

Klo dibahasa seperti golang, untuk membuat custom error itu sangat mudah, kita bisa pakai errors.New("errornya apa"), ataupun buat struct yang mengimplementasikan sifat error, seperti contoh:

type ErrorFinder{}

func (ef ErrorFinder) Error() string{
	return "Error finder"
}

Namun kemudahan di Go tidak bisa diterpakan di rust, jadi ada beberapa tahapan yang perlu dilakukan. Pertama, kita mesti buat dulu struct error nya :

struct	ErrorFinder {};

Setelah dideklarasi kita perlu mengimplementasikan method ari fmt::Display ke struct EmptyFinder. Ini sepemahan saya seperti interface Stringer di golang, jadi bisa di print sebgai sebuah string.

impl fmt::Display for ErrorFinder {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "Error from finder")
    }
}

Langkah berikutnya adalah memberitahu ke compiler bahwa struct ErrorFinder bisa dipakai atau mengimplementasi Error, dengan cara seperti berikut:

impl error::Error for EmptyVec {}

Untuk contoh penggunaan seperti kode berikut:

#[derive(Debug, Clone)]
struct EmptyVec;

impl fmt::Display for EmptyVec {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "invalid first item to double")
    }
}

impl Error for EmptyVec {}

fn check() -> Result<i32, EmptyVec> {
    Err(EmptyVec.into())
}

fn main() {
	println!("Hello World")

	let a = check();
	match  a {
		Ok(i) => println!("{}", i),
		Err(e) => println!("error {}", e.to_string())
	};
}

Referensi: