2011-05-11 20 views
6

Dosya içeriğinde eval yapıyorum. Dosya ayrıştırdığım etiketlerden yapılmış. Her satırın bir etiketi vardır ve her etiket için proc tanımlanmış, böylece eval başarılı olur. Ancak, bazen kullanıcılar yeni etiketler ekledikten sonra bilinmeyen komut nedeniyle eval komutu başarısız olur.Tcl'nin bilinmeyen komutta kilitlenmesini engelle

eval bilinmeyen bir komut çalışırken Tcl'nin çökmesini engellemenin bir yolu var mı?
İdeal olarak, bir hataya işaret etmek ve eval ile devam etmek gibi kendi tanımlanmış davranışımla değiştirmeme izin vermeliyiz.


DÜZENLEME:

Maalesef, sadece Tcl 8.4 kullanabilirsiniz. Sonra

proc handle_unknown_label {cmd args} { ... } 

ve:
Ben aşağıdakileri, as suggested here yapıyor çalıştı

rename unknown _old_system_unknown 
rename handle_unknown_label unknown 

catch {set ret [eval $x]} err 

rename unknown handle_unknown_label 
rename _old_system_unknown unknown 

ama hala eval için aynı davranışı elde ve aşağıdaki hataları yazdırır:

yordam bilinmiyor, korumalı bir proc olduğunu ve yeniden adlandırılmaması gereken
yordamı bilinmiyor bir pro tected proc ve
prosedür bilinmeyen overriden almazsınız korumalı proc ve
prosedür bilinmeyen bir korumalı proc değiştirildi almazsınız gibi sürer,

+1

uygulanamaz, ancak bir dosya okuyor ve değerlendiriyorsanız, bunun yerine dosyaya da kaynak olabilirsiniz, değil mi? Bu Tcl yorumlayıcısı hangi ortamda –

+1

? Bu "korumalı proc" hatası ile aşina değilim. –

+0

@glenn İlginç. Yani bu benim şirketimde devre dışı bırakılmış bir şey olabilir mi? –

cevap

2

Kendi komut unknown denilen Uygulamak overriden almazsınız onun argümanlar tüm bulunamayan komutu oluşturan kelimeler ve args:

Eğer namespace unknown kullanımı ile artırabilirsiniz olsa yapmanız gereken yaklaşık hepsi
proc unknown {cmdName args} { 
    puts "UNKNOWN COMMAND: $cmdName" 
    puts "CALLED WITH ARGUMENTS: $args" 
} 

.

+0

Teşekkürler! 'Namespace unknown' komutunun nasıl kullanıldığına dair bir örnek verebilir misiniz? Bilinmeyen komutların işlenmesini geçici olarak değiştirmek istiyorum, bu yüzden varsayılan kullanımın nasıl değiştirileceğini ve geri yükleneceğini bilmek istiyorum. –

+0

Lütfen benim düzenleme başlığına bakın –

+0

@Amir: Birisi sizi ağır bir şekilde kilitledi, bu yüzden öneremeyeceğimiz pek bir şey yok (belki de barındırma sistemindeki dokümanları okumaktan başka). Size dilde standart mekanizmayı anlattık… –

3

ben bariz ifade ediyorum düşünüyorum, ama eval 'bir dosya ing tehlikelidir: herhangi bir kullanıcı böyle bir dosya içine [exec whatever they wish] gömebilirsiniz. Bu "etiketleri" okumak ve devasa bir anahtar veya bir karma haritası veya önceden belirlenmiş bir komutu yürütmek için her ne olursa olsun çok daha iyi olurdu. " Mevcut olmayan "etiketleri" yakalamak da sorun olmaz.

+0

Öneriyi takdir ediyorum. Ancak, bu soruya gerçekten bir cevap değil ve bence bu bir yorum olmalı. –

+0

Bu oldukça iyi bir cevap TBH. Tüm geçerli etiketlerin bir listesini saklayın, sadece okuduğunuz liste o listede değilse, kendi seçiminizi arayın. Sorunu tam olarak çözer ve önyükleme için güvenliği ekler. – ZoFreX