Özel durum işleme sözdizimi - Exception handling syntax

Özel durum işleme sözdizimi bir bilgisayar tarafından sağlanan anahtar kelimeler ve / veya yapılar kümesidir Programlama dili izin vermek istisna işleme, bir programın çalışması sırasında ortaya çıkan hataların işlenmesini olağan işlemlerinden ayırır. İstisna işleme sözdizimi aşağıdakiler arasında değişir: Programlama dilleri, kısmen anlamsal farklılıkları kapsamak, ancak büyük ölçüde her dilin geneline uymak için sözdizimsel yapı. Bazı diller ilgili kavramı çağırmaz "istisna işleme "; diğerleri bunun için doğrudan olanaklara sahip olmayabilir, ancak yine de onu uygulamak için araçlar sağlayabilir.

En yaygın olarak, hata işleme bir dene ... [yakala ...] [sonunda ...] blok ve hatalar bir atmak ifadesi, ancak adlandırma ve sözdiziminde önemli farklılıklar vardır.

İstisna işleme sözdizimleri kataloğu

Ada

İstisna beyanları
Bazı_Error : istisna;
İstisnaları artırma
yükseltmek Bazı_Error;yükseltmek Bazı_Error ile "Bellek yetersiz"; - özel teşhis mesajı
İstisna işleme ve yayılma
ile Ada.İstisnalar, Ada.Text_IO;prosedür Foo dır-dir  Bazı_Error : istisna;başla  Do_Something_Interesting;istisna - İstisna işleyicilerin başlangıcı  ne zaman Constraint_Error =>    ... - Kısıtlama hatası işleme  ne zaman Storage_Error =>    - Storage_Error'ı kullanışlı bir mesajla farklı bir istisna olarak yay    yükseltmek Bazı_Error ile "Bellek yetersiz";  ne zaman Hata : diğerleri =>     - Diğerlerini hallet    Ada.Text_IO.Koymak("İstisna:");    Ada.Text_IO.Put_Line(Ada.İstisnalar.İstisna_Adı(Hata));    Ada.Text_IO.Put_Line(Ada.İstisnalar.Exception_Message(Hata));son Foo;

Assembly dili

Çoğu montaj dilinin, belirli sistem için geçersiz işlem kodları, program denetimi, veri hataları, taşma, sıfıra bölme ve benzeri olayları kesmesi için bir makro talimatı veya kesme adresi bulunur. IBM ve Univac ana bilgisayarları, STXIT makro. Digital Equipment Corporation RT11 sistemler, program hataları, g / ç kesintileri ve benzeri için tuzak vektörlerine sahipti. DOS belirli kesme adreslerine sahiptir. Microsoft Windows program hatalarını yakalamak için belirli modül çağrıları vardır.

Bash

#! / usr / bin / env bash#set -e başka bir hata mekanizması sağlarprint_error(){	Eko "Bir hata oluştu"}tuzak print_error çıkış # tuzaklanacak sinyalleri listelegeçici dosya=`mktemp`tuzak "rm $ tempfile" çıkış./other.sh || Eko uyarı: diğer başarısız olduEko oops)Eko asla basılmadı

Aşağıdaki gibi sözdizimine sahip herhangi bir sinyale yanıt vererek, birden çok hata için bir tuzak kurabilirsiniz:

tuzak '$ {LINENO} satırında echo Hatası' ERR

TEMEL

Bir Goto / gosub hatası yapı BASIC'te kullanılır ve modern istisna işlemeden oldukça farklıdır; BASIC'de yalnızca bir global işleyici varken, modern istisna işlemede istisna işleyiciler yığılır.

HATAGİTişleyiciAÇIK"Somefile.txt"İÇİNGİRİŞGİBİ#1KAPAT#1YAZDIR"Dosya başarıyla açıldı"SONişleyici:YAZDIR"Dosya bulunmuyor"SONBunun yerine kontrolü orijinal konuma döndüren RESUME kullanılabilir.

C

C, istisna işlemeye doğrudan destek sağlamaz: ilk etapta hataları önlemek ve işlevlerden dönüş değerlerini test etmek programcının sorumluluğundadır.

Her durumda, standart C'de istisna işlemeyi uygulamanın olası bir yolu, setjmp / longjmp fonksiyonlar:

#Dahil etmek <setjmp.h>#Dahil etmek <stdio.h>#Dahil etmek <stdlib.h>Sıralama { SOME_EXCEPTION = 1 } istisna;jmp_buf durum;int ana(geçersiz){  Eğer (!setjmp(durum))                      // Deneyin  {    Eğer (/* bir şey oldu */)    {      istisna = SOME_EXCEPTION;      longjmp(durum, 0);                  // SOME_EXCEPTION at    }  }   Başka değiştirmek(istisna)  {                 durum SOME_EXCEPTION:                  // SOME_EXCEPTION yakala      koyar("SOME_EXCEPTION yakalandı");      kırmak;    varsayılan:                              // tutmak ...      koyar("Bazı garip istisnalar");  }  dönüş ÇIKIŞ_ BAŞARI;}

Microsoft'a özgü

İki tür vardır:

  • Yapılandırılmış İstisna İşleme (SEH)
  • Vektörlü İstisna İşleme (VEH, Windows XP )

C programlama dilinde SEH örneği:

int filterExpression (EXCEPTION_POINTERS* ep) {   ep->Bağlam Kaydı->Eip += 8; // bölme talimatı 2 ila 8 bayt arasında kodlanabilir   dönüş EXCEPTION_CONTINUE_EXECUTION;}int ana(geçersiz) {   statik int sıfır;   __Deneyin {       sıfır = 1/sıfır;       __asm {         hayır         hayır         hayır         hayır         hayır         hayır         hayır       }       printf ("İstisnayı geçmiş.");   } __dışında (filterExpression (GetExceptionInformation())) {       printf ("İşleyici aradı.");   }   dönüş 0;}

C #

Bir Deneyin blokta en az bir tane olmalıdır tutmak veya en sonunda cümle ve en fazla bir en sonunda fıkra.

halka açık statik geçersiz Ana(){    Deneyin    {        // Bir istisna atabilecek kod.    }    tutmak (HttpException eski)    {        // Bir HttpException'ı işler. İstisna nesnesi "ex" de saklanır.    }    tutmak (İstisna)    {        // HttpException olmayan herhangi bir CLR istisnasını işler.        // İstisnaya bir tanımlayıcı verilmediğinden, ona referans verilemez.    }    tutmak    {        // CLR dışı istisnalar da dahil olmak üzere fırlatılabilecek her şeyi ele alır.    }    en sonunda    {        // Herhangi bir istisnanın atılıp atılmadığına veya işlenip işlenmediğine bakılmaksızın, try bloğundan çıkarken (catch cümleleri dahil) her zaman çalıştır.        // Genellikle böyle bir dosya tanıtıcısı gibi kaynakları temizlemek ve kapatmak için kullanılır.        // Environment.FailFast () çağrıldığında ve diğer sistem genelindeki istisnai koşullarda (ör. Güç kaybı) veya işlem başka bir iş parçacığındaki bir istisna nedeniyle çöktüğünde çalıştırılamaz.    }}

C ++

#Dahil etmek <exception>int ana() {   Deneyin {       // bir şeyler yap (bir istisna oluşturabilir)   }   tutmak (sabit std::istisna& e) {        // e istisnasını işle   }   tutmak (...) {        // daha önce bir catch bloğu tarafından yakalanmamış tüm istisnaları yakalar        // bilinmeyen veya alakasız türdeki istisnayı yakalamak için kullanılabilir   }}

C ++ 'da bir kaynak edinme başlatmadır teknik, istisnai durumlarda kaynakları temizlemek için kullanılabilir. C ++ kasıtlı olarak desteklemiyor en sonunda.[1] Yöntem için dış parantez isteğe bağlıdır.

ColdFusion İşaretleme Dili (CFML)

Komut dosyası sözdizimi

<cfscript>Deneyin {	// CF9 + fırlat	atmak(tip="TypeOfException", İleti="Hata", detay="xyz");	// alternatif atış sözdizimi:	atmak "Hata"; // bu, yukarıdaki örnekteki "mesaj" değerine eşdeğerdir} tutmak (hiç e) {	writeOutput("Hata: " & e.İleti);	yeniden atmak; // CF9 +} en sonunda { // CF9 +	writeOutput("Hata olmasa bile koşarım");}</ cfscript>

Adobe ColdFusion belgeleri[2]

Etiket sözdizimi

<cftry>     istisnaya neden olabilecek kod  ...>         <cftry>             Birinci düzey istisna işleme kodu  ...>                 İkinci düzey istisna işleme kodu </cfcatch>            <cffinally>                     son kod </cffinally>         </cftry>     </cfcatch> </cftry>

Adobe ColdFusion belgeleri[3]

Railo-Lucee'ye özgü sözdizimi

Yukarıdaki standart sözdizimine eklendi, CFML lehçeleri Railo ve Lucee izin ver yeniden dene Beyan.[4]

Bu ifade, işlemeyi bir öncekinin başlangıcına döndürür Deneyin blok.

CFScript örneği:

Deneyin {	// bir istisnaya neden olabilecek kod } tutmak (hiç e){	yeniden dene;}

Etiket söz dizimi örneği:

<cftry>	<!--- code which could result in an exception --->	<cfcatch>		<cfretry>	</cfcatch></cftry>

D

ithalat std.standart; // writeefln () içinint ana() {  Deneyin {      // bir istisna oluşturabilecek bir şey yapın  }  tutmak (FooException e) {       // FooException türündeki istisnaları ele alın  }  tutmak (Nesne Ö) {       // diğer istisnaları ele alın       writeefln("İşlenmeyen özel durum: ", Ö);       dönüş 1;  }  dönüş 0;}

D'de, a en sonunda cümle veya kaynak edinme başlatmadır teknik, istisnai durumlarda kaynakları temizlemek için kullanılabilir.

Delphi

İstisna beyanları
tip EÖzel = sınıf(İstisna) // İstisnalar, Exception sınıfının alt öğeleridir.  özel    FCustomData: Bazı Tür;      // İstisnaların özel uzantıları olabilir.  halka açık    kurucu CreateCustom(Veri: Bazı Tür); // Bir uygulamaya ihtiyaç duyar    Emlak CustomData: Bazı Tür okumak FCustomData;  son;
İstisnaları artırma
yükseltmek İstisna.Oluşturmak('İleti');yükseltmek İstisna.CreateFmt('Değerli mesaj:% d,% d',[değer1, değer2]); // Parametreler için bkz. SysUtils.Format (). yükseltmek EÖzel.CreateCustom(X);
İstisna işleme ve yayılma[5]
Deneyin // Nihayet.  Deneyin // Hariç.    ... // Bir istisna oluşturabilecek kod.  dışında    açık C:EÖzel yapmak      başla        ... // ECustom işle.        ... Eğer Dayanak(C.CustomData) sonra ...      son;    açık S:ESomeOtherException yapmak      başla        // Başka bir istisna olarak yayılır.        yükseltmek EYetAnotherException.Oluşturmak(S.İleti);       son;    açık E:İstisna yapmak      başla        ... // Diğer istisnaları ele alın.        yükseltmek; // Yaymak.      son;  son; en sonunda  // Bir istisnanın ortaya çıkıp çıkmadığını yürütmek için kod (ör. Temizleme kodu).son;

Erlang

Deneyin  % bazı tehlikeli kodlartutmak  atmak:{bir hata, X} -> Tamam mı;    % bir istisna işlemek  hata:X -> Tamam mı;                 % başka bir istisnayı ele alır  _:_ -> Tamam mı                      % tüm istisnaları ele alınsonra  % Temizlemekson

F #

OCaml tabanlı dene ... ile, F # ayrıca ayrı dene ... sonunda bir try bloğu ile aynı davranışa sahip olan yapı en sonunda diğer .NET dillerinde fıkra.

Karşılaştırma için bu bir çeviridir yukarıdaki C # örneği.

Deneyin    Deneyin        () (* Bir istisna oluşturabilecek kod. *)    ile    | :? Sistem..WebException gibi eski -> () (* Bir WebException'ı işler. İstisna nesnesi şurada saklanır: "eski". *)    | :? exn -> () (* Herhangi bir CLR istisnasını işler. İstisnaya bir tanımlayıcı verilmediğinden, referans gösterilemez. *)    | _ -> () (* CLR dışı istisnalar da dahil olmak üzere atılabilecek her şeyi ele alır. *)en sonunda    ()     (*       Try bloğundan çıkarken, herhangi bir istisnanın atılıp atılmadığına veya ele alınmasına bakılmaksızın her zaman çalıştırın.       Genellikle böyle bir dosya tanıtıcısı kaynakları temizlemek ve kapatmak için kullanılır.       Environment.FailFast () çağrıldığında ve diğer sistem genelindeki istisnai koşullarda (örn. Güç kaybı) veya işlem başka bir iş parçacığındaki bir istisna nedeniyle çöktüğünde çalıştırılamaz.    *)

Karşılaştırma için bu çeviridir aşağıdaki OCaml örneği.

istisna MyException nın-nin dizi * int (* istisnalar bir değer taşıyabilir *)İzin Vermek _ =  Deneyin    yükseltmek (MyException ("Yetersiz yiyecek", 2));    printfn "Erişilmemiş"  ile  | MyException (s, ben) ->       printf "MyException:% s,% d" s ben  | e ->  (* tüm istisnaları yakala *)     eprintf "Beklenmeyen istisna:% O" e;     eprintf "%Ö" e.Yığın izleme

Haskell

Haskell'in istisnalar için özel sözdizimi yoktur. Bunun yerine, bir Deneyin/tutmak/en sonunda/vb. arayüz fonksiyonlar tarafından sağlanır.

ithalat Başlangıç saklanma(tutmak)ithalat Control.Exceptionörnek İstisna Intörnek İstisna Çiftana = yapmak  tutmak    (tutmak      (atmak (42::Int))      (e-> Yazdır (0,e::Çift)))    (e-> Yazdır (1,e::Int))

baskılar

(1,42)

bu C ++ ile benzer şekilde

#Dahil etmek <iostream>kullanma ad alanı std;int ana(){  Deneyin    {atmak (int)42;}  tutmak(çift e)    {cout << "(0," << e << ")" << son;}  tutmak(int e)    {cout << "(1," << e << ")" << son;}}

Başka bir örnek ise

yapmak {  - Hataların atılabileceği ifadeler} `tutmak` eski -> yapmak {  - Bir istisna durumunda, istisnaya 'ex' bağlı olan ifadeler}

Tamamen işlevsel kodda, yalnızca bir hata durumu varsa, Olabilir tür yeterli olabilir ve Haskell'in bir örneğidir Monad sınıf varsayılan olarak. Daha karmaşık hata yayılımı, Hata veya ErrorT benzer işlevselliği olan monadlar (kullanarak `tutmak`) desteklenir.

Java

Bir Deneyin blokta en az bir tane olmalıdır tutmak veya en sonunda cümle ve en fazla bir en sonunda fıkra.

Deneyin {    // Normal yürütme yolu.    atmak yeni EmptyStackException();} tutmak (ExampleException ee) {    // ExampleException ile ilgilenin.} en sonunda {    // Herhangi bir istisnanın atılıp atılmadığına veya işlenip işlenmediğine bakılmaksızın, try bloğundan çıkarken her zaman çalıştır (final cümleleri dahil).    // Genellikle böyle bir dosya tanıtıcısı gibi kaynakları temizlemek ve kapatmak için kullanılır.    // System.exit () çağrıldığında ve diğer sistem genelindeki istisnai koşullarda (örn. Güç kaybı) çalıştırılamaz.}

JavaScript

JavaScript'in tasarımı yüksek / zor hataları çok nadir hale getirir. Yumuşak / sessiz hatalar çok daha yaygın. Zor hatalar en yakın yere yayılır Deneyin tek bir ifadenin ardından gelmelidir tutmak cümle, tek bir en sonunda cümle veya her ikisi.

Deneyin {  // İstisnaların ortaya çıkabileceği ifadeler  atmak yeni Hata("hata");} tutmak(hata) {  // Bir istisna durumunda çalışan ifadeler} en sonunda {  // Daha sonra her iki şekilde de çalışan ifadeler}

Eğer yoksa Deneyin herhangi bir ifade varsa, web sayfası çökmez. Bunun yerine, konsola bir hata kaydedilir ve yığın temizlenir. Bununla birlikte, JavaScript'in ilginç tuhaflığı asenkron harici olarak çağrılan giriş noktalarına sahiptir. Diğer birçok dilde, her zaman kodun bir kısmı her zaman çalışır durumdayken, JavaScript'in baştan sona doğrusal olarak çalışması gerekmez. Örneğin, olay dinleyicileri, Sözler ve zamanlayıcılar, tarayıcı tarafından daha sonraki bir zamanda çağrılabilir ve kodun geri kalanıyla izole edilmiş ancak paylaşılan bir bağlamda çalıştırılabilir. Aşağıdaki kodun belirsiz bir süre boyunca veya tarayıcı / sekme / bilgisayar kapatılıncaya kadar her 4 saniyede bir yeni bir hata vereceğini gözlemleyin.

setInterval(işlevi() {  atmak yeni Hata("4 saniyelik bir aralıkta atılan bir hata örneği.");}, 4000);

Bir başka ilginç tuhaflık ise polimorfizmdir: JavaScript, ilkel değerleri hata olarak atabilir.

Deneyin {  atmak 12345; // ilkel sayı} tutmak(hata) {  konsol.günlük(hata); // 12345'i konsola ilkel bir sayı olarak kaydeder}

Unutmayın ki tutmak yan tümce, her tür hatayı yakalayan bir tümünü yakalar. Yıllar öncesinden deneysel ve halihazırda kaldırılan Gecko uzantılarının yanı sıra, farklı işleyicileri farklı hata türlerine atamak için sözdizimsel bir yetenek yoktur. Bunun yerine, hatayı bir kullanarak yayılabilir. atmak içindeki ifade tutmak ifade veya birden çok koşullu durum kullanın. Java'daki bir örneği ve JavaScript'teki kaba eşdeğerlerini karşılaştıralım.

// Java ÖrneğiDeneyin {  Tamsayı ben = boş;  ben.intValue(); // bir NullPointerException oluşturur} tutmak(NullPointerException hata) {  // Değişken boş olabilir} tutmak(Aritmetik İstisna hata) {  // Sayılarla ilgili sorunları ele alın}
// JavaScript'te 1. YaklaşımDeneyin {  // İstisnaların ortaya çıkabileceği ifadeler  var misal = boş;  misal.toString();} tutmak(hata) {  Eğer (hata.tip === "TypeError") {    // Değişken boş olabilir  } Başka Eğer (hata.tip === "RangeError") {    // Sayılarla ilgili sorunları ele alın  }}
// JavaScript'te 2. YaklaşımDeneyin {  Deneyin {    // İstisnaların ortaya çıkabileceği ifadeler    var misal = boş;    misal.toString();  } tutmak(hata) {    Eğer (hata.tip !== "TypeError") atmak hata;    // Değişken boş olabilir  }} tutmak(hata) {  Eğer (hata.tip !== "RangeError") atmak hata;  // Sayılarla ilgili sorunları ele alın}

İstisnaların bir başka yönü, istisnayı eşzamansız olarak ele alan vaatlerdir. İstisnayı eşzamansız olarak ele almak, hata işleyicideki hataların daha fazla dışa doğru yayılmaması avantajına sahiptir.

yeni Söz vermek(işlevi() {	atmak yeni Hata("Örnek hata!");}).tutmak(işlevi(hata) {	konsol.günlük("Yakalandı", hata);});

Ayrıca, olay işleyicilerinin vaatlere nasıl bağlanabildiğini de gözlemleyin.

addEventListener("işlenmemiş ret", işlevi(Etkinlik) {  konsol.günlük(Etkinlik.sebep);  Etkinlik.preventDefault(); // hatayı console.error aracılığıyla konsola kaydetmeyi önle - varsayılan davranış});yeni Söz vermek(işlevi() {  atmak yeni Hata("Örnek hata!");});

Son olarak, JavaScript işaret ve süpür çöp toplamayı kullandığından, atma ifadelerinden hiçbir zaman bellek sızıntısı olmadığını unutmayın, çünkü tarayıcı döngüsel referanslarla bile ölü nesneleri otomatik olarak temizler.

Deneyin {  // İstisnaların ortaya çıkabileceği ifadeler  sabit obj = {};  obj.selfPropExample = obj; // döngüsel başvuru  atmak obj;} tutmak(hata) {  // Bir istisna durumunda çalışan ifadeler}

Lisp

Ortak Lisp

(yok sayma hataları (/ 1 0))(işleyici çantası    (tahmin      (Yazdır "bir ifade girin")      (değerlendirme (okumak)))  (hata (e) (Yazdır e)))(gevşetmek    (tahmin       (Yazdır "bir ifade girin")       (değerlendirme (okumak)))  (Yazdır "Bu baskı her zaman en sonunda olduğu gibi yürütülecektir."))

Lua

Lua, pcall ve xpcall fonksiyonlar ile xpcall olarak hareket etmek için bir işlev almak tutmak blok.

Önceden tanımlanmış işlev
işlevi foo(x)  Eğer x sonra     dönüş x  Başka    hata "Gerçek bir değer değil"  sonsonişlevi girişim(arg)  başarı, değer = pcall(foo, arg)  Eğer değil başarı sonra     Yazdır("Hata: " .. tostring(değer))  Başka    Yazdır("İade: " .. tostring(değer))  sonsongirişim("Merhaba")  - Geri döndü: merhabagirişim(sıfır)  - Hata: stdin: 5: Gerçek bir değer değilgirişim({})  - İade: tablo: 00809308    Eğer foo(42) sonra Yazdır "Başarılı" son  - Başarı
Anonim işlev
Eğer pcall(  işlevi()    - Hataya neden olabilecek bir şey yapın.  son) sonra  Yazdır "Hata yok"  - Korumalı arama başarılı olduysa yürütülür.Başka  Yazdır "Hatayla karşılaşıldı"  - Korumalı çağrı başarısız olursa yürütülür.sonYazdır "Bitti"  - Her zaman idam edilecek

Yeni Nesil Kabuk

Özel istisna türünü tanımlama
tip Hatam(Hata)
İstisnaları artırma
atmak Hatam("bu oldu")
İstisna işleme ve yayılma
Deneyin {  # bir şey} tutmak(e:Hatam) {  koruma e.val = 7  # ...} tutmak(e:Hatam) {  # ...} tutmak(e:Hata) {  # ...}
İstisnaları yok saymak - yakalamadan deneyin
Deneyin 1/0  # boş olarak değerlendirilir
İstisnaları yok saymak - "tor" operatörü

"tor", dene veya operatördür. Soldaki argümanı değerlendirirken herhangi bir istisna olması durumunda, sağdaki argümanı değerlendirir.

1/0 tor 20  # 20 olarak değerlendirilir
"engelle" - bir değer döndürmek için istisnaları kullanma olanağı
sonucum = blok Bloğum {  # "blok" aşağıya dönüş tarafından atılan istisnayı yakalar  # hesaplama yap  Eğer hesaplama_bitmiş() {    Bloğum.dönüş(42)  # istisna atar  }}

Amaç-C

İstisna beyanları
NSException *istisna = [NSException exceptionWithName:@ "myException"                           sebep:@"her neyse"  Kullanıcı bilgisi:sıfır];
İstisnaları artırma
@atmak istisna;
İstisna işleme ve yayılma
@Deneyin {    ...}@tutmak (SomeException *se) {    // Belirli bir istisna türünü işleyin.    ...}@tutmak (NSException *ne) {    // Genel istisnaları ele alın.    ...    // İstisnayı daha yüksek bir seviyede ele alınacak şekilde yay.    @atmak;}@tutmak (İD ue) {    // Atılan tüm nesneleri yakala.    ...}@en sonunda {    // Bir istisna olsa da olmasa da temizleme gerçekleştirin.    ...}

OCaml

istisna MyException nın-nin dizi * int (* istisnalar bir değer taşıyabilir *)İzin Vermek _ =  Deneyin    yükseltmek (MyException ("Yetersiz yiyecek", 2));    print_endline "Erişilmemiş"  ile  | MyException (s, ben) ->       Printf.printf "MyException:% s,% d" s ben  | e ->  (* tüm istisnaları yakala *)     Printf.eprintf "Beklenmeyen istisna:% s" (Printexc.to_string e);     (* Ocaml> = 3.11 kullanılıyorsa, geriye dönük iz de yazdırmak mümkündür: *)     Printexc.print_backtrace Stderr;       (* Geri izleme kaydını önceden etkinleştirmeniz gerekir.           Printexc.record_backtrace true         veya OCAMLRUNPARAM = "b1" * ortam değişkenini ayarlayarak

Perl 5

Perl istisna işleme kullanımları için mekanizma ölmek içine sarıldığında bir istisna atmak değerlendirme { ... }; blok. Sonra değerlendirmeözel değişken $@ gelen değeri içerir ölmek. Ancak, kapsam belirleme sorunları bunu doğru şekilde yapmayı oldukça çirkin hale getirebilir:

benim ($ error, $ başarısız oldu);{    yerel $@;    $ başarısız oldu = değil değerlendirme {        # Bir istisna oluşturabilecek kod ('die' kullanarak)        açık(DOSYA, $ dosya) || ölmek "Dosya açılamadı: $!";        süre (<FILE>) {            process_line($_);        }        kapat(DOSYA) || ölmek "$ File kapatılamadı: $!";        dönüş 1;    };    $ error = $@;}Eğer ($ başarısız oldu) {    uyarmak "hata aldı: $ hata";}

Perl 5.005, nesnelerin yanı sıra dizeleri de fırlatma yeteneğini ekledi. Bu, özel durum türlerinin daha iyi iç gözlemine ve ele alınmasına olanak tanır.

değerlendirme {    açık(DOSYA, $ dosya) || ölmek MyException :: Dosya->yeni($!);    süre (<FILE>) {        process_line($_);    }    kapat(DOSYA) || ölmek MyException :: Dosya->yeni($!);};Eğer ($@) {    # İstisna nesnesi $ @ içinde    Eğer ($@->isa('MyException :: Dosya')) {        # Dosya istisnasını işle    } Başka {        # Genel istisna işleme        # veya 'die $ @' ile yeniden at    }}

__ÖLMEK__ sözde sinyal, çağrıları işlemek için tuzağa düşebilir ölmek. Bu, küresel olduğu için istisna işleme için uygun değildir. Bununla birlikte, üçüncü taraf paketlerden dize tabanlı istisnaları nesnelere dönüştürmek için kullanılabilir.

yerel $ SIG{__ÖLMEK__} = alt {    benim $ err = vardiya;    Eğer ($ err->isa('MyException')) {        ölmek $ err; # yeniden at    } Başka {        # Aksi takdirde, dizge olarak $ err ile bir MyException oluşturun        ölmek MyException :: Varsayılan->yeni($ err);    }};

Yukarıda gösterilen formlar, global değişken $@ istisnanın atıldığı ve kontrol edildiği zaman arasında değişir. Eğer ($@) Beyan. Bu, çok iş parçacıklı ortamlarda veya tek iş parçacıklı ortamlarda, diğer kod (genellikle bazı nesnelerin yok edilmesinde çağrılır) kontrol kodundan önce genel değişkeni sıfırladığında gerçekleşebilir. Aşağıdaki örnek, bu sorunu önlemenin bir yolunu gösterir (bkz. [1][ölü bağlantı ] veya [2]; cf. [3] ). Ancak dönüş değerlerini kullanamama pahasına:

değerlendirme {    # Bir istisna atabilen ('die' kullanarak) ancak return ifadesini KULLANMAYAN kod;    1;} veya yapmak {    # İstisnayı burada ele alın. İstisna dizesi $ @ içinde};

Comprehensive Perl Archive Network'teki (CPAN ) temel mekanizmayı genişletin:

  • Hata bir dizi istisna sınıfı sağlar ve dene / fırlat / yakala / nihayet sözdiziminin kullanımına izin verir.
  • TryCatch ve Deneyin::Çok küçük her ikisi de istisnaları doğru şekilde ele almak için standart metin yerine try / catch / nihayet sözdiziminin kullanılmasına izin verir.
  • İstisna::Sınıf türetilmiş istisna sınıfları için temel bir sınıf ve sınıf oluşturucudur. Tam yapılandırılmış bir yığın izleme içinde $@->iz ve $@->iz->as_string.
  • Ölümcül doğru / yanlış döndüren önceden tanımlanmış işlevleri aşırı yükler, ör. açık, kapat, okumak, yazmak, vb. Bu, yerleşik işlevlerin ve diğerlerinin istisnalar atıyormuş gibi kullanılmasına izin verir.

PHP

// İstisna işleme yalnızca PHP 5 ve sonraki sürümlerinde mevcuttur.Deneyin {    // Bir istisna oluşturabilecek kod    atmak yeni İstisna('Geçersiz URL.');} tutmak (FirstExceptionClass $ istisna) {    // Bu istisnayı işleyen kod} tutmak (SecondExceptionClass $ istisna) {    // Farklı bir istisnayı işleyen kod} en sonunda {    // Bir istisna olsa da olmasa da temizleme gerçekleştirin.}

PowerBuilder

İstisna işleme, PowerBuilder 8.0 ve üzeri sürümlerde mevcuttur.

TRY // Normal yürütme yoluCATCH (ExampleException ee) // ExampleException ile başa çıkmak SONUNDA // Bu isteğe bağlı bölüm, yukarıdaki deneme veya yakalama bloklarından herhangi birinin sonlandırılması üzerine çalıştırılırEND TRY

Güç kalkanı

Sürüm 1.0

tuzak [İstisna]{    # Bir istisna durumunda yürütülen ifadeler}# İstisnaların ortaya çıkabileceği ifadeler

Sürüm 2.0

Deneyin {    İthalat Modülü ActiveDirectory    }Tutmak [Exception1] {  # Bir istisna durumunda çalışan, istisnayla eşleşen ifadeler    }Tutmak [Exception2], [Exception3etc] {  # İstisnalardan herhangi biriyle eşleşen bir istisna durumunda yürütülen ifadeler    }Tutmak {  # Bir istisna durumunda yürütülen, daha özel olarak ele alınmayan ifadeler    }

Python

f = YokDeneyin:    f = açık("aFileName", "w")    f.yazmak(can_make_error())dışında IOError:    Yazdır("Dosya açılamıyor")dışında:  # tüm istisnaları yakala    Yazdır("Beklenmeyen hata")Başka:  # hiçbir istisna ortaya çıkmazsa çalıştırılır    Yazdır("Dosya yazma başarıyla tamamlandı")en sonunda:  # temizleme eylemi, her zaman yürütülür    Eğer f:        f.kapat()

R

tryCatch({   Dur("Burada bir hata bildiriliyor")   # default S3-class is simpleError bir alt hata sınıfı   kedi("Hata daha önce yakalandığı için bu ve sonraki satırlar yürütülmez")   Dur( yapı(simpleError("mySpecialError mesajı"),sınıf=c("özel Hata","hata","şart")) )},özel Hata=işlevi(e){    kedi("specialError sınıfındaki hataları yakalar")},hata=işlevi(e){    kedi("varsayılan hatayı yakalar")},en sonunda={ kedi("biraz temizlik yap (ör. setwd)") })

Rebol

REBOL [    Başlık: "İstisna ve hata işleme örnekleri"]; Bir blok DENEYİN; bir hatayı yakalamak! ve nesneye dönüştürme!Eğer hata? istisna: Deneyin [1 / 0][incelemek, bulmak etkisiz hale getirmek istisna]; ATTEMPT, bloğun değeriyle veya hata durumunda hiçbiri değeriyle sonuçlanırYazdır girişim [bölmek 1 0]; Kullanıcı tarafından oluşturulan istisnalar herhangi bir veri türü olabilir!misal: işlev ["Bir istisna atan işlev"][    atmak "Ben bir dizeyim! İstisna"]tutmak [misal]; Kullanıcı tarafından oluşturulan istisnalar da adlandırılabilir,; ve işlevler ek çalışma zamanı öznitelikleri içerebilir sofistike: işlev ["Adlandırılmış bir hata istisnası atan bir işlev"    [tutmak]][    atmak/ isim Yapmak hata! "Ben bir hatayım! İstisna" 'lakap]tutmak/ isim [sofistike] 'lakap

Rexx

sinyalaçıkdurmak;yapmaka=1	 söylea	 yapmak100000/* gecikme */	 sonsondurmak:söyle"Program kullanıcı tarafından durduruldu"çıkış

Yakut

başla  # Şık bir şeyler yapın  yükseltmek SomeError, "Bu hata mesajıdır!"  # Uh-oh!kurtarmak SomeError  # Bu, SomeError istisnası olduğunda çalıştırılır.  # yükseltildikurtarmak Başka Bir Hata => hata  # Burada, istisna nesnesine,  # "hata 'değişkenikurtarmak  # Bu, StandardError'dan türetilen tüm istisnaları yakalar  yeniden dene # Bu, başlangıç ​​bölümünü yeniden çalıştırırBaşka  # Bu yalnızca hiçbir istisna ortaya çıkmadıysa yürütülürsağlamak  # Bu her zaman yürütülür, istisna olsun veya olmasınson

Argo

 {% bir istisna atabilecek kod} deneyin BazıError: {% bu istisnayı işleyen kod} yakalayın BazıOtherError: {% bu istisnayı işleyen kod} sonunda% isteğe bağlı blok {% Bu kod her zaman çalıştırılır}

Kullanılarak yeni istisnalar oluşturulabilir. new_exception işlev, ör.

 new_exception ("MyIOError", IOError, "G / Ç Hatam");

adlı bir istisna yaratacak MyIOError alt sınıfı olarak IOError. İstisnalar, rastgele atılabilen throw ifadesi kullanılarak oluşturulabilir. Argo nesneler.

Smalltalk

  [ "bir istisna oluşturabilecek kod" ]     üzerinde: ExceptionClass      yapmak: [:eski | "istisnai işleyen kod" ].

Genel mekanizma mesajla sağlanır üzerinde:yapmak:.[6] İstisnalar, alt sınıflara giren normal nesnelerdir. Hata, bir örnek oluşturup ona bir #signal mesaj, ör. MyException yeni sinyal. Taşıma mekanizması (#on: yap:) yine normal bir mesajdır. BlockClosure. Atılan istisna, işleme bloğu kapanışına bir parametre olarak iletilir ve sorgulanabilir ve potansiyel olarak gönderilebilir #devam et yürütme akışının devam etmesine izin vermek için.

Swift

Özel durum işleme, Swift 2'den beri desteklenmektedir.

Sıralama MyException : ErrorType {  durum Foo(Dize, Int)}işlev someFunc() atar {  atmak MyException.Foo("Yetersiz yiyecek", 2)}yapmak {  Deneyin someFunc()  Yazdır("Erişilmemiş")} tutmak MyException.Foo(İzin Vermek s, İzin Vermek ben) {  Yazdır("MyException: (s), (ben)")} tutmak {  Yazdır("Beklenmedik istisna : (hata)")}

Tcl

Eğer { [ tutmak {    foo} hata ] } {    koyar "Hata: $ err"}

Tcl 8.6'dan beri, bir de try komutu var:

Deneyin {    someCommandWithExceptions} tamam {res seçmek} {    # normal durumu ele alın.} tuzak ListPattern1 {hata seçmek} {    # ListPattern1 ile eşleşen bir hata kodu ile istisnaları ele alın} tuzak ListPattern2 {hata seçmek} {    # ...} hatalı {hata seçmek} {    # diğer her şeyi halledin.} en sonunda {    # try bloğundan sonra çalıştırılması gereken komutları çalıştırın.}

VBScript

İle Yeni Deneyin: Açık Hata Devam et Sonraki    do Something (sadece bir ifade önerilir).Tutmak: Açık Hata Git 0: Seçiniz Durum .Numara    Durum 0 VBScript Case deyiminde "Is" anahtar sözcüğü bulunmaması nedeniyle "Case Else" yan tümcesi kullanılırken bu satır gereklidir        'istisna yok    Durum YANLIŞ NUMARA        'istisna işleme    Durum Başka        'bilinmeyen istisnaSon Seçiniz: Son İle'*** Sınıfı Deneyin ***Sınıf Deneyin    Özel mstrAçıklama    Özel mlngHelpContext    Özel mstrHelpFile    Özel mlngNumber    Özel mstrSource    halka açık Alt Tutmak()        mstrAçıklama = Err.Açıklama        mlngHelpContext = Err.HelpContext        mstrHelpFile = Err.Yardım Dosyası        mlngNumber = Err.Numara        mstrSource = Err.Kaynak    Son Alt    halka açık Emlak Almak Kaynak()        Kaynak = mstrSource    Son Emlak        halka açık Emlak Almak Numara()        Numara = mlngNumber    Son Emlak    halka açık Emlak Almak Yardım Dosyası()        Yardım Dosyası = mstrHelpFile    Son Emlak        halka açık Emlak Almak HelpContext()        HelpContext = mlngHelpContext    Son Emlak        halka açık Emlak Almak Açıklama()        Açıklama = mstrAçıklama    Son EmlakSon Sınıf

[7]

Visual Basic 6

İstisna işleme sözdizimi Basic'e çok benzer. Hata işleme her prosedürde yereldir.

Açık Hata Git İşleyici Etiketi Hata oluştuğunda, Function veya Sub içinde herhangi bir yerde tanımlanan HandlerLabel'e atlar.'veyaAçık Hata Git 0 hata işlemeyi kapatın. Hata, ölümcül çalışma zamanı hatasına neden olur ve uygulamayı durdurur'veyaAçık Hata Devam et Sonraki Object Err ayarlandı, ancak yürütme bir sonraki komutta devam ediyor. Hata durumunu kontrol etmek için hala Err nesnesini kullanabilirsiniz.'...Err.Yükseltmek 6   Yerleşik nesne Err kullanarak bir "Taşma" hatası oluştur. Hata işleyici yoksa, çağrı prosedürü istisnayı aynı sözdizimine göre yakalayabilir'...Nihayet Etiket: 'prosedür içinde sadece ortak etiket (diğer dillerden Nihayet bölümünün resmi olmayan öykünmesi)    'temizleme kodu, her zaman çalıştırılırçıkış Alt 'çıkışlar prosedürÇünkü Exit Sub deyiminin peşindeyiz, sonraki kod hatasız yürütme için gizlidirİşleyici Etiketi: ', burada istisna işleme için kullanılan ortak bir etiketi tanımlar.Eğer Err.Numara = 6 Sonra 'Select Case ifadesi genellikle daha iyi bir çözümdür    Devam et Nihayet Etiket 'belirli bir etiket üzerinde yürütmeye devam edin. Diğer dillerde tipik olarak "Nihayet" anlamına gelen bir şey    'veya    Devam et Sonraki "Err.Raise 6" yanındaki ifadede yürütmeye devam et    'veya    Devam et "Err.Raise 6" ifadesindeki (tekrar) yürütmeye devam etSon EğerMsgBox Err.Numara & " " & Err.Kaynak & " " & Erl & " " & Err.Açıklama & " " & Err.LastDllError önemli hata özelliklerine sahip mesaj kutusunu göster    Erl, VB6 yerleşik satır numarası genel değişkenidir (eğer kullanılıyorsa). Tipik olarak, derlemeden önce her kod satırını numarayla etiketleyen bir tür IDE Eklentisi kullanılır.Devam et Nihayet Etiket

"Try" sınıfının nesnesini kullanan özel (resmi olmayan) istisna işleme uygulaması örneği.

İle Yeni Deneyin: Açık Hata Devam et Sonraki "Dene" sınıfının yeni nesnesini oluşturun ve kullanın. Ardından bu nesneyi varsayılan olarak ayarlayın. "Dim T As New Try: ... ... T.Catch olabilir    do Something (sadece bir ifade önerilir).Tutmak: Açık Hata Git 0: Seçiniz Durum .Numara Try.Catch () prosedürünü çağırın. Ardından hata işlemeyi kapatın. Daha sonra Try.Number özelliğinin sonucu üzerinde "anahtar benzeri" ifadeyi kullanın (Err özelliğinin değeri. Yerleşik Err nesnesinin sayısı)    Durum YANLIŞ NUMARA        'istisna işleme    Durum Dır-dir <> 0 Err.Number sıfır olduğunda hiçbir hata oluşmaz        'bilinmeyen istisnaSon Seçiniz: Son İle'*** Sınıfı Deneyin ***Özel mstrAçıklama  Gibi DizeÖzel mlngHelpContext  Gibi UzunÖzel mstrHelpFile     Gibi DizeÖzel mlngLastDllError Gibi UzunÖzel mlngNumber       Gibi UzunÖzel mstrSource       Gibi Dizehalka açık Alt Tutmak()    mstrAçıklama = Err.Açıklama    mlngHelpContext = Err.HelpContext    mstrHelpFile = Err.Yardım Dosyası    mlngLastDllError = Err.LastDllError    mlngNumber = Err.Numara    mstrSource = Err.KaynakSon Althalka açık Emlak Almak Kaynak() Gibi Dize    Kaynak = mstrSourceSon Emlakhalka açık Emlak Almak Numara() Gibi Uzun    Numara = mlngNumberSon Emlakhalka açık Emlak Almak LastDllError() Gibi Uzun    LastDllError = mlngLastDllErrorSon Emlakhalka açık Emlak Almak Yardım Dosyası() Gibi Dize    Yardım Dosyası = mstrHelpFileSon Emlakhalka açık Emlak Almak HelpContext() Gibi Uzun    HelpContext = mlngHelpContextSon Emlakhalka açık Emlak Almak Açıklama() Gibi Dize    Açıklama = mstrAçıklamaSon Emlak

[7]

Visual Basic .NET

Bir Deneyin blok en az bir maddeye sahip olmalıdır Tutmak veya En sonunda cümle ve en fazla bir En sonunda fıkra.

Deneyin   burada çalıştırılacak kodTutmak eski Gibi İstisna Ne zaman şart   'Belirli bir koşul doğru olduğunda İstisnayı ele alın. İstisna nesnesi "ex" de saklanır.Tutmak eski Gibi ExceptionType   Belirli bir türdeki İstisnayı İşle (yani DivideByZeroException, OverflowException, vb.)Tutmak eski Gibi İstisna   'İşleme İstisnası (önceden belirtilmemiş bir türdeki tüm istisnaları yakala)Tutmak   CLR dışı istisnalar dahil olmak üzere fırlatılabilecek her şeyi ele alır.En sonunda   Herhangi bir istisnanın atılıp atılmadığına veya işlenip işlenmediğine bakılmaksızın try bloğundan çıkarken (catch cümleleri dahil) her zaman çalıştır.   Genellikle böyle bir dosya tanıtıcısı kaynakları temizlemek ve kapatmak için kullanılır.   Environment.FailFast () çağrıldığında ve diğer sistem genelindeki istisnai koşullarda (ör. Güç kaybı) veya işlem başka bir iş parçacığındaki bir istisna nedeniyle çöktüğünde çalıştırılamaz.Son Deneyin

Görsel Prolog

http://wiki.visual-prolog.com/index.php?title=Language_Reference/Terms# Try-catch-finally

Deneyin    Korunacak engelleme yüzdesitutmak İzleme Kimliği yapmak    % Bir istisna durumunda çalıştırılacak kod; TraceId, istisna bilgilerine erişim sağlaren sonunda    % Kodu dikkate alınır ancak diğer kısımlar davranırson Deneyin

X ++

halka açık statik geçersiz Ana(Args _args){   Deneyin   {      // Bir istisna atabilecek kod.   }   tutmak (İstisna::Hata) // Veya başka herhangi bir istisna türü.   {      // Hatayı işleyin.   }   tutmak   {      // Daha önce ele alınmayan diğer istisna türlerini işleyin.   }   // Buradaki kod, herhangi bir istisna yakalandığı sürece çalışacaktır.}

Referanslar

  1. ^ Bjarne Stroustrup SSS
  2. ^ "İstisnaları işleme". Arşivlenen orijinal 2014-01-02 tarihinde. Alındı 2014-01-01.
  3. ^ "İstisna işleme etiketleri". Arşivlenen orijinal 2014-01-02 tarihinde. Alındı 2014-01-01.
  4. ^ https://issues.jboss.org/browse/RAILO-2176 # Eklemek için JBoss Community sorun izci bileti yeniden dene
  5. ^ Borland, Delphi Sürüm 7.0, Çevrimiçi yardım
  6. ^ "Örnekle Pharo". Arşivlenen orijinal 2009-10-21 tarihinde. Alındı 2010-03-20.
  7. ^ a b VB için Try-Catch

Ayrıca bakınız