2012-04-26 17 views
23

java'da olduğu gibi yakalama ve yakalama işlevselliği sağlayan modülün Error olduğunu buldum. Ama geri dönen istisnayı nasıl yazdıracağınız konusunda kafam karıştı.Hata denetimi, perdede hatasız olarak nasıl kullanılır?

aşağıdaki

try { 
    // do something that will fail! 

} catch (Error e) { 
    // Print out the exception that occurred 
    System.out.println(e.getMessage()); 
} 

nasıl yığın izleme hatasının baskı alabilirim nasıl anlamak istiyorum?

cevap

40

Sen pitfalls with older perls bir dizi önlemeye yardımcı olur Try::Tiny kullanarak kapalı muhtemelen daha iyi. Eğer deneyin :: Minik biraz daha güçlü bir şey istiyorsanız

use Try::Tiny; 

try { 
     die "foo"; 
} catch { 
     warn "caught error: $_"; 
}; 
+0

Bu uyarıyı günlüklere nasıl yüklerim? – pitchblack408

+0

İstisnalar oluşturabilir miyim? – pitchblack408

+1

Ne sorduğundan emin değilim. Günlük dosyalarına giriş yaparak bunları günlüğe kaydedersiniz ve “die” veya “croak” kullanarak istisnalar yaratırsınız. İstisna nesneleri vb. Nasıl arayacağınızı mı soruyorsunuz? Bu ayrı bir soru olurdu. –

36

Son ben Error kullanımdan kaldırıldı, kontrol etti. Ama burada o modül olmadan bunu yapacağını nasıl:

eval { 
    die "Oops!"; 
    1; 
} or do { 
    my $e = [email protected]; 
    print("Something went wrong: $e\n"); 
}; 

Temelde, yerine throw ait eval yerine try, die kullanın ve [email protected] yılında istisna arayın. eval blok sonunda gerçek değeri 5.14 daha eski, detaylar için P::C::P::ErrorHandling::RequireCheckingReturnValueOfEval bkz Perl sürümlerinde tekrar kullanılmadan önce istemeden değiştirmesini [email protected] önlemek için bir deyim parçasıdır. Örneğin, bu kod bu kusurdan muzdarip.

# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14 
eval { 
    die "Oops!"; 
}; 
if (my $e = [email protected]) { 
    print("Something went wrong: $e\n"); 
} 
# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14 

Ama başarısız olduğunda birçok Perl işlemleri istisnaları yükseltmeyin dikkat ; Sadece bir hata kodu döndürürler. Bu davranış, yerleşik ve standart modüller için autodie aracılığıyla değiştirilebilir. Eğer autodie kullanıyorsanız, o zaman try/catch yapmanın standart yol (düz autodie perldoc dışında) şudur:

use feature qw(switch); 

eval { 
    use autodie; 

    open(my $fh, '<', $some_file); 

    my @records = <$fh>; 

    # Do things with @records... 

    close($fh); 

}; 

given ([email protected]) { 
    when (undef) { say "No error";     } 
    when ('open') { say "Error from open";    } 
    when (':io') { say "Non-open, IO error.";   } 
    when (':all') { say "All other autodie errors." } 
    default  { say "Not an autodie error at all." } 
} 

bir stacktrace almak için, Carp bak.

+0

bakınız [deneyin :: Tiny' docs 'in AMAÇ bölüm] (http://search.cpan.org/perldoc/Try::Tiny#BACKGROUND) Eski' perl's zaman ile yaşayabileceğiniz sorunlar için istisna işleme için 'eval' kullanma. –

+0

[İstisna işleme 5.14.0 giderilmiştir] (http://search.cpan.org/perldoc/perl5140delta#Exception_Handling) –

+0

Ben, nasıl kaldırılmış ne öğrenebilirim Perl programının yeni? Eval kullanmak istemiyorum {çünkü doğal hissetmiyor. Bir java/C++/C# arka planından geliyorum. Yani, Try :: Tiny 'e geçersem daha yeni ve daha istikrarlı olur mu? – pitchblack408

5

, sen CPAN içinde TryCatch modülü bakarak denemek isteyebilirsiniz.

İlgili konular