Error Handling Menggunakan panic!

Syntax dari panic adalah

panic!("your-custom-message-goes-here");

Kapan panic digunakan

Perintah panic dapat digunakan ketika situasi:

  • Melanjutkan aplikasi adalah salah, contoh mengakses out of bound index array. Melakukan panic akan mencegah celah keamanan buffer overflow.
  • Tidak mungkin melakukan recover.
  • Ketika masalah harus diselesaikan dengan mengubah code.

Berikut contoh sederhana menggunakan panic.

#[derive(Debug)]
enum Platform {
    Windows,
    Linux,
    Macos,
}

impl Platform {
    fn parse(platform: &str) -> Platform {
        if platform == "windows" {
            Platform::Windows
        }else if platform == "linux" {
            Platform::Linux
        }else if platform == "macos"{
            Platform::Macos
        }else{
            panic!("Unknown platform: {}. Valid values: windows, linux, macos", platform);
        }
    }
}

fn main(){
    let plat_arg = "apel";
    let platform = Platform::parse(plat_arg);
    println!("Output : {:?}", platform);
}

Karena plat_arg berisi data yang tidak diharapkan, akan masuk kedalam block else yang berisi perintah panic.

thread 'main' panicked at 'Unknown platform: apel. Valid values: windows, linux, macos', src\main.rs:19:13
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: process didn't exit successfully: `target\debug\rustdasar.exe` (exit code: 101)

Macro lain untuk melakukan panic

  • unreachable!, digunakan ketika compiler tidak dapat menentukan code tertentu adalah unreachable. Contoh loops yang diterminate secara dinamis.
  • unimplemented!, digunakan untuk code yang belum diimplementasikan.
  • assert!, umum digunakan pada test code, tidak akan dibahas dalam tutorial rust dasar.

Berikut contoh penggunaannya

enum DoorState {
    Opened,
    Closed,
}

enum DoorAction {
    Open, 
    Close,
}

fn take_act(cur_state: DoorState, act: DoorAction){
    match (cur_state, act){
        (DoorState::Opened, DoorAction::Close) =>{
            unimplemented!();
        },
        (DoorState::Closed, DoorAction::Open) =>{
            unimplemented!();
        },
        _ => unreachable!(),
    }

}

fn main(){
    take_act(DoorState::Opened, DoorAction::Open);
    //take_act(DoorState::Opened, DoorAction::Close);
}

Dengan berakhirnya modul ini, tutorial Rust Dasar sudah selesai. Semoga bermanfaat.

Sharing is caring:

Leave a Comment