Pas - Hata Giderme

Rust'ta, hatalar aşağıdaki tabloda gösterildiği gibi iki ana kategoriye ayrılabilir.

Sr.No İsim & Açıklama Kullanım
1

Recoverable

Ele alınabilecek hatalar

Sonuç sıralaması
2

UnRecoverable

Ele alınamayan hatalar

panik makro

Kurtarılabilir hata, düzeltilebilen bir hatadır. Bir program, başarısız olan işlemi yeniden deneyebilir veya kurtarılabilir bir hatayla karşılaştığında alternatif bir eylem şekli belirleyebilir. Kurtarılabilir hatalar, bir programın aniden başarısız olmasına neden olmaz. Kurtarılabilir bir hataya örnek, Dosya Bulunamadı hatasıdır.

Kurtarılamayan hatalar bir programın aniden başarısız olmasına neden olur. Kurtarılamaz bir hata oluşursa bir program normal durumuna geri dönemez. Başarısız işlemi yeniden deneyemez veya hatayı geri alamaz. Kurtarılamaz bir hata örneği, bir dizinin sonunun ötesindeki bir konuma erişmeye çalışmaktır.

Diğer programlama dillerinin aksine Rust'un istisnaları yoktur. Kurtarılabilir hatalar için enum Result <T, E> döndürür ,panicmakro, program kurtarılamaz bir hatayla karşılaşırsa. Panik makro aniden çıkmak için programı neden olur.

Panik Makro ve Düzeltilemez Hatalar

panik! makrosu, bir programın hemen sonlandırılmasına ve programı arayan kişiye geri bildirim sağlamasına izin verir. Bir program kurtarılamaz bir duruma ulaştığında kullanılmalıdır.

fn main() {
   panic!("Hello");
   println!("End of main"); //unreachable statement
}

Yukarıdaki örnekte, program panikle karşılaştığında hemen sona erecektir ! makro.

Çıktı

thread 'main' panicked at 'Hello', main.rs:3

İllüstrasyon: panik! makro

fn main() {
   let a = [10,20,30];
   a[10]; //invokes a panic since index 10 cannot be reached
}

Çıktı aşağıda gösterildiği gibidir -

warning: this expression will panic at run-time
--> main.rs:4:4
  |
4 | a[10];
  | ^^^^^ index out of bounds: the len is 3 but the index is 10

$main
thread 'main' panicked at 'index out of bounds: the len 
is 3 but the index is 10', main.rs:4
note: Run with `RUST_BACKTRACE=1` for a backtrace.

Bir program paniğe yol açabilir! aşağıdaki örnekte gösterildiği gibi iş kuralları ihlal edilirse makro -

fn main() {
   let no = 13; 
   //try with odd and even
   if no%2 == 0 {
      println!("Thank you , number is even");
   } else {
      panic!("NOT_AN_EVEN"); 
   }
   println!("End of main");
}

Yukarıdaki örnek, değişkene atanan değer tek ise bir hata verir.

Çıktı

thread 'main' panicked at 'NOT_AN_EVEN', main.rs:9
note: Run with `RUST_BACKTRACE=1` for a backtrace.

Sonuç Sıralaması ve Kurtarılabilir Hatalar

Enum Sonucu - <T, E> kurtarılabilir hataları işlemek için kullanılabilir. İki çeşidi vardır -OK ve Err. T ve E genel tür parametreleridir. T OK varyantı içinde başarılı bir durumda döndürülecek değerin türünü temsil eder ve E Err varyantındaki bir hata durumunda döndürülecek hatanın türünü temsil eder.

enum Result<T,E> {
   OK(T),
   Err(E)
}

Bunu bir örnek yardımıyla anlayalım -

use std::fs::File;
fn main() {
   let f = File::open("main.jpg"); 
   //this file does not exist
   println!("{:?}",f);
}

Dosya zaten varsa program Tamam (Dosya) ve dosya bulunamazsa Err (Hata) döndürür .

Err(Error { repr: Os { code: 2, message: "No such file or directory" } })

Şimdi Err varyantını nasıl kullanacağımızı görelim.

Aşağıdaki örnek, dosya açılırken döndürülen bir hatayı işler. match Beyan

use std::fs::File;
fn main() {
   let f = File::open("main.jpg");   // main.jpg doesn't exist
   match f {
      Ok(f)=> {
         println!("file found {:?}",f);
      },
      Err(e)=> {
         println!("file not found \n{:?}",e);   //handled error
      }
   }
   println!("end of main");
}

NOTE- Program , dosya bulunamadığı halde ana olayın sonunu yazdırır . Bu, programın hatayı özenle ele aldığı anlamına gelir.

Çıktı

file not found
Os { code: 2, kind: NotFound, message: "The system cannot find the file specified." }
end of main

İllüstrasyon

İs_even sayısı çift değilse işlev bir hata döndürür. Main () işlevi bu hatayı işler.

fn main(){
   let result = is_even(13);
   match result {
      Ok(d)=>{
         println!("no is even {}",d);
      },
      Err(msg)=>{
         println!("Error msg is {}",msg);
      }
   }
   println!("end of main");
}
fn is_even(no:i32)->Result<bool,String> {
   if no%2==0 {
      return Ok(true);
   } else {
      return Err("NOT_AN_EVEN".to_string());
   }
}

NOTE- Ana işlev hatayı incelikle işlediğinden , ana ifadenin sonu yazdırılır.

Çıktı

Error msg is NOT_AN_EVEN
end of main

wraps () ve wait ()

Standart kitaplık, hem numaralandıran - Result <T, E> hem de Option <T> uygulayan birkaç yardımcı yöntem içerir . Bunları, gerçekten bir şeylerin başarısız olmasını beklemediğiniz hata durumlarını basitleştirmek için kullanabilirsiniz. Bir yöntemden başarı elde edilmesi durumunda, gerçek sonucu çıkarmak için "çözme" işlevi kullanılır.

Sr.No Yöntem İmza ve Açıklama
1 açmak

unwrap(self): T

Kendinin Tamam / Bazı olmasını bekler ve içinde bulunan değeri döndürür. Eğer öyleyseErr veya None bunun yerine, görüntülenen hatanın içeriği ile bir panik yaratır.

2 beklemek

expect(self, msg: &str): T

Hatanın içeriğine ek olarak paniklemeden önce özel bir mesaj çıkarması dışında, çözme gibi davranır.

sarılmamış ()

Wrrap () işlevi, bir işlemin başarılı olduğu gerçek sonucu döndürür. Bir işlem başarısız olursa varsayılan hata mesajı ile panik verir. Bu işlev, maç açıklaması için bir kısaltmadır. Bu, aşağıdaki örnekte gösterilmektedir -

fn main(){
   let result = is_even(10).unwrap();
   println!("result is {}",result);
   println!("end of main");
}
fn is_even(no:i32)->Result<bool,String> {
   if no%2==0 {
      return Ok(true);
   } else {
      return Err("NOT_AN_EVEN".to_string());
   }
}
result is true
end of main

Yukarıdaki kodu, tek sayıya geçmek için değiştirin. is_even() işlevi.

Unwrap () fonksiyonu panik ve aşağıda gösterildiği gibi varsayılan bir hata mesajı döndürür

thread 'main' panicked at 'called `Result::unwrap()` on 
an `Err` value: "NOT_AN_EVEN"', libcore\result.rs:945:5
note: Run with `RUST_BACKTRACE=1` for a backtrace

beklemek ()

Program panik durumunda özel bir hata mesajı döndürebilir. Bu, aşağıdaki örnekte gösterilmektedir -

use std::fs::File;
fn main(){
   let f = File::open("pqr.txt").expect("File not able to open");
   //file does not exist
   println!("end of main");
}

Beklenen () işlevi, wrrap () işlevine benzer. Tek fark, özel bir hata mesajının bekleme kullanılarak görüntülenebilmesidir.

Çıktı

thread 'main' panicked at 'File not able to open: Error { repr: Os 
{ code: 2, message: "No such file or directory" } }', src/libcore/result.rs:860
note: Run with `RUST_BACKTRACE=1` for a backtrace.