Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Hata Yönetimi

Hatalar yazılım geliştirmenin kaçınılmaz bir gerçeğidir; bu nedenle Rust, bir şeylerin ters gittiği durumları ele almak için çeşitli özellikler sunar. Pek çok durumda Rust, kodunuzun derlenebilmesi için olası bir hatayı kabul etmenizi ve buna karşı bir önlem almanızı zorunlu kılar. Bu zorunluluk, kodunuzu üretime almadan önce olası hataları fark etmenizi ve uygun biçimde ele almanızı sağlayarak programınızı daha sağlam hâle getirir!

Rust, hataları iki ana kategoriye ayırır: kurtarılabilir (recoverable) ve kurtarılamayan (unrecoverable) hatalar. Örneğin bir dosya bulunamadı hatası gibi kurtarılabilir bir hata durumunda, büyük olasılıkla yalnızca sorunu kullanıcıya bildirmek ve işlemi yeniden denemek isteriz. Kurtarılamayan hatalar ise bir dizinin sonunun ötesindeki bir konuma erişmeye çalışmak gibi her zaman koddaki kusurların (bug) belirtisidir; bu nedenle programı derhal durdurmak isteriz.

Çoğu programlama dili bu iki hata türü arasında ayrım yapmaz ve istisnalar (exceptions) gibi mekanizmalar kullanarak her ikisini de aynı biçimde ele alır. Rust’ta istisna mekanizması yoktur. Bunun yerine Rust, kurtarılabilir hatalar için Result<T, E> türüne ve program kurtarılamayan bir hatayla karşılaştığında yürütmeyi durduran panic! makrosuna sahiptir. Bu bölümde önce panic! makrosunu çağırmayı, ardından Result<T, E> değerleri döndürmeyi ele alacağız. Ek olarak, bir hatadan kurtulmaya çalışmak ile programın yürütülmesini durdurmak arasında karar verirken göz önünde bulundurulması gereken ölçütleri inceleyeceğiz.

Not: C++, Java, Python, C# veya JavaScript gibi try/catch tabanlı istisna fırlatan dillerden geliyorsanız, Rust’ın hataları fırlatmak yerine sıradan dönüş değerleri olarak modellemesi ilk başta farklı gelebilir. İstisna kullanan pek çok dilde yalnızca bir fonksiyonun imzasına bakarak o fonksiyonun hata fırlatıp fırlatmayacağını anlamak zordur; gözden kaçan bir istisna çağrı yığını boyunca sessizce yükselip canlı ortamda beklenmedik çökmelere yol açabilir. Rust’ta ise kurtarılabilir hatalar genellikle dönüş türündeki Result<T, E> ile açıkça belirtilir ve döndürülen bir Result değerini yanlışlıkla görmezden geldiğinizde derleyici (#[must_use] özniteliği sayesinde) sizi uyarır. Bu, bir fonksiyonun panikleyemeyeceği anlamına gelmez: Result, normal hata akışını modeller. Birazdan göreceğimiz ? operatörü de bu hataları çağıran fonksiyona kısa ve okunaklı biçimde iletmemizi sağlar.

Standart kütüphanedeki bu sağlam temelin üzerine gerçek dünya projelerinde topluluğun geliştirdiği iki popüler crate de sıklıkla eklenir: kütüphane geliştirirken yapılandırılmış özel hata türleri tanımlamayı kolaylaştıran thiserror ve uygulama katmanında farklı hata türlerini bağlam (context) bilgisiyle ergonomik biçimde yönetmeyi sağlayan anyhow. Bu bölümde panic! ve Result<T, E> mekanizmalarını sağlam biçimde kavradığınızda, ekosistemdeki bu araçları da zahmetsizce kullanabilirsiniz.