Delphi İstisna İşleme'deki Özel Durumları İşleme Üzerine

click fraud protection

İşte ilginç bir gerçek: Hayır kod hatasızdır - aslında, bazı kodlar bilerek "hatalarla" doludur.

Bir uygulamadaki hata nedir? Hata, bir soruna yanlış kodlanmış bir çözümdür. Bunlar mantık hataları bu, her şeyin güzelce bir araya getirildiği ancak uygulamanın sonucunun tamamen kullanılamadığı yanlış işlev sonuçlarına yol açabilir. Mantık hatalarıyla, uygulama çalışmayı bırakıp bırakmayabilir.

İstisnalar, kodunuzdaki sayıları sıfırla bölmeye çalıştığınız veya serbest bellek bloklarını kullanmayı veya bir işleve yanlış parametreler sağlamayı denediğiniz hataları içerebilir. Ancak, uygulamadaki bir istisna her zaman bir hata değildir.

İstisnalar ve İstisna Sınıfı

İstisnalar, özel kullanım gerektiren özel durumlardır. Bir hata türü koşulu oluştuğunda, program bir istisna oluşturur.

Siz (uygulama yazarı olarak), uygulamanızı hataya daha açık hale getirmek ve istisnai duruma yanıt vermek için istisnaları ele alacaksınız.

Çoğu durumda, kendinizi uygulama yazarı ve ayrıca kütüphane yazarı olarak görürsünüz. Bu nedenle, istisnaları (kitaplığınızdan) nasıl oluşturacağınızı ve bunları nasıl uygulayacağınızı (uygulamanızdan) bilmeniz gerekir.

instagram viewer

İle ilgili makale hataları ve istisnaları işleme istisnai durumlara yanıt vermek veya bunları ele almak için try / hariç / end ve try / son olarak / end korumalı blokları kullanarak hatalara karşı nasıl korunacağınıza dair bazı temel yönergeler sağlar.

Koruma blokları dışında basit bir deneme / şuna benzer:


Deneyin
ThisFunctionMightRaiseAnException ();
dışında// ThisFunctionMightRaiseAnException () öğesinde belirtilen istisnaları burada ele alın
son;

ThisFunctionMightRaiseAnException uygulamasında şöyle bir kod satırı içerebilir:


yükseltmek İstisna. Oluştur ('özel durum!');

İstisna, sysutils.pas biriminde tanımlanan özel bir sınıftır (adın önünde T olmayan birkaç kişiden biridir). SysUtils ünitesi birkaç özel amaçlı İstisna torunu tanımlar (ve böylece istisna sınıfları hiyerarşisi) ERangeError, EDivByZero, EIntOverflow vb.

Çoğu durumda, korumalı denemede / hariç blokta işleyeceğiniz istisnalar İstisna değildir (base) sınıfı, ancak VCL'de veya kütüphanede tanımladığınız bazı özel Exception alt sınıflarından kullanarak.

Try / Except Kullanarak İstisnaları İşleme

Bir özel durum türünü yakalamak ve işlemek için bir "type_of_exception do" özel durum işleyicisi oluşturacaksınız. "İstisnada" klasik vaka ifadesine çok benzer:


Deneyin
ThisFunctionMightRaiseAnException;
excepton EZeroDivide dobegin// sıfıra bölündüğünde bir şeyson;
üzerinde EIntOverflow dobegin// çok büyük tamsayı hesaplama olduğunda bir şeyson;
elsebegin// diğer istisna türleri yükseltildiğinde bir şeyson;
son;

Diğer bölümün, hakkında hiçbir şey bilmedikleriniz de dahil olmak üzere tüm (diğer) istisnaları alacağını unutmayın. Genel olarak, kodunuz yalnızca gerçekten nasıl işleneceğini bildiğiniz ve atılmasını beklediğiniz istisnaları işlemelidir.

Ayrıca, bir istisna asla "yememelisiniz":


Deneyin
ThisFunctionMightRaiseAnException;
dışında
son;

Kural dışı durumu yemek, kural dışı durumu nasıl ele alacağınızı bilmediğiniz anlamına gelir veya kullanıcıların kural dışı durumu veya aradaki herhangi bir şeyi görmesini istemediğiniz anlamına gelir.

İstisnayı ele aldığınızda ve bundan daha fazla veriye ihtiyacınız olduğunda (sonuçta bir sınıfın örneğidir), yalnızca yapabileceğiniz istisnanın türü yerine:


Deneyin
ThisFunctionMightRaiseAnException;
excepton E: İstisna dobegin
ShowMessage (E.Message);
son;
son;

"E: Özel Durum" içindeki "E", sütun karakterinden sonra belirtilen türde geçici bir özel durum değişkenidir (yukarıdaki örnekte temel Özel Durum sınıfında). E kullanarak, Message özelliğini alma veya ayarlama gibi özel durum nesnesine değerleri okuyabilir (veya yazabilirsiniz).

İstisnaları Kim Serbest Bırakır?

İstisnaların aslında İstisnadan inen bir sınıfın örnekleri olduğunu fark ettiniz mi? Yükselt anahtar kelimesi bir istisna sınıfı örneği atar. Yarattığınız şey (istisna örneği bir nesnedir), ayrıca boşuna ihtiyacım var. Siz (kütüphane yazarı olarak) bir örnek oluşturursanız, uygulama kullanıcısı bunu serbest bırakır mı?

Burada Delphi magic: Bir istisnayı işlemek istisna nesnesini otomatik olarak yok eder. Bu, kodu "hariç / son" bloğuna yazdığınızda, özel durum belleğini serbest bırakacağı anlamına gelir.

Öyleyse ThisFunctionMightRaiseAnException gerçekten bir istisna oluşturursa ve bunu tutmazsanız (bu "yemek" ile aynı değildir) ne olur?

Sayı / 0 Kullanılmadığında Ne Olur?

Kodunuzda işlenmeyen bir özel durum atıldığında, Delphi hata iletisini kullanıcıya görüntüleyerek özel durumunuzu yine sihirli bir şekilde işler. Çoğu durumda, bu iletişim kutusu, istisnanın nedenini anlaması için kullanıcıya (ve son olarak siz) yeterli veri sağlamaz.

Bu, Delphi'nin üst düzey mesaj döngüsü tarafından kontrol edilir. herşey kural dışı durumlar global Application nesnesi ve onun HandleException yöntemi tarafından işlenir.

İstisnaları global olarak ele almak ve daha kullanıcı dostu bir iletişim kutusu göstermek için TApplicationEvents için kod yazabilirsiniz. OnException olay işleyicisi.

Genel Uygulama nesnesinin Formlar biriminde tanımlandığını unutmayın. TApplicationEvents, genel Application nesnesinin olaylarını durdurmak için kullanabileceğiniz bir bileşendir.

instagram story viewer