2012-03-30 21 views

cevap

5

Tcl tarafından atılan her türlü hatayı yakalama ana komutu catch'dur. En az bir argüman, değerlendirilecek bir betik alır ve bu kodu değerlendiren sonuç kodunu döndürür. Bir hata oluştuğunda, 0 hata ve diğer durumlarda (genellikle hata yapmayan istisnanın diğer türlerini belirten) diğer şeyler bir demet olduğunda sonuç kodu 1 olur. catch ayrıca, hata iletisini veya veya komut dosyası değerlendirmesinin sonucunu yazmak için bir değişkene adlandıran isteğe bağlı bir argüman alır. errorInfo genel değişkeni, bir hata durumunda yığın izlemeyi içerecektir (veya 8,5'ten itibaren yorumlayıcı durum sözlüğünü, catch'a iletilen başka bir değişken adıyla alabilirsiniz). Tuzak

bazı komut dosyası “foo.tcl” bir hata, böyle bir kod kullanırsınız:

if {[catch {source foo.tcl} msg]} { 
    puts "I got an error: $msg" 
    puts "The stack trace was this:\n$errorInfo" 
} 

O isterseniz bir dosyaya dikkat yazmak için nasıl çalışmak size kalmış. (Bu tekniği, dikkatle test edilmiş bir hata tuzağını uygulayan ve gerçek işi yapan bir iç komut dosyasını yükleyen bir dış komut dosyası ile kullanıyorum. İyi çalıştığını buluyorum. Veya bu "yakalanan" komut dosyasında yordamları arayabilirsiniz. ; Tcl tüm hataları yakalanabilir yapmalıdır ve arasından kayıp çok az durum vardır)


olay sırasında oluşan hataları işlemek için çağrılır hatalar bildirilir edilebileceğini diğer rota bgerror yoluyladır. işleme. Kendi versiyonunuzu yazabileceğiniz bir prosedür; o hata mesajı olduğunu aradığında tek argüman verilecek ve aradığında küresel errorInfo doğru ayarlanmış sahip olacaktır: tanımlanmış bgerror hiçbir uygulama yoksa

proc bgerror {msg} { 
    global errorInfo 
    puts "I got an error in an event: $msg" 
    puts "The stack trace was this:\n$errorInfo" 
} 

, yığın izleme sadece yazılır stderr kanalı. Tk paketini kullanıyorsanız, sorunu açıklayan bir iletişim kutusu açan bir bgerror uygulaması sağlanmıştır.

1

Bgerror veya interp bgerror komutlarını deneyin.

bgerror belgelerini okuyun, bunun basit bir örneği vardır.

+0

İyi öneri. Ama işe yaramıyor. :(Hala Tcl yorumlayıcı hatası alıyorum: "on1" okuyamıyor: terminalde böyle bir değişken 'yok', ancak işlevde değil. – ilya1725