2012-07-11 12 views
7

Ben Powershell ile tuhaf bir sorunla karşılaşmak ediyorum içeride doldurmamak. Bir catch bloğundaki bir Except'i yakalarım ancak global $ Error nesnesi doldurulmuyor.

function Bar 
{ 
    Foo 
} 

function Foo 
{ 
    try 
    { 
    $Error.Clear() 
    throw "Error!" 
    } 
    catch 
    { 
    "Caught an error - current error count $($Error.Count)" 
    } 
    finally 
    { 
    "Cleaning up - current error count $($Error.Count)" 
    } 
} 

Çıktı sen

Caught an error - current error count 1 
Cleaning up - current error count 1 

I sorun yaşıyorum kod Bar

ararsanız beklediğiniz gibi geçerli:

bu beklendiği gibi davranır Önemsiz bir örnek şudur neredeyse aynıdır, ancak bir modülden Foo yükler. Bir modüle kapalı Foo kaydederseniz bu bir hata, ya da ben anlamıyorum sadece bir şey (! Eylem kitapta benim Powershell kontrol etmek zorunda kalacak)

olup olmadığından emin değil - Foo.psm1

function Foo 
{ 
    try 
    { 
    $Error.Clear() 
    throw "Error!" 
    } 
    catch 
    { 
    "Caught an error - current error count $($Error.Count)" 
    } 
    finally 
    { 
    "Cleaning up - current error count $($Error.Count)" 
    } 
} 

Export-ModuleMember -Function Foo 

Sonra

Import-Module .\Foo.psm1 
$Error.Clear() 
"Current error count $($Error.Count)" 
Foo 
"Current error count $($Error.Count)" 

Foo artık gördüğü

Current error count 0 
Caught an error - current error count 0 
Cleaning up - current error count 0 
Current error count 1 

Bildirimi ile bitirmek aşağıdaki gerçekleştirmek Ny değişiklikler $ Error yapılır. Böylece kodun modül-ification hata yayılma davranışını değiştiriyor. Bunun arkasındaki akıl yürütme ile kimse başlayabilir mi?

ben otomatik değişken $ _ aracılığıyla belirli yakalandı istisna almak unutmayın gerekirdi, ama çağrı yığını bu noktada tüm koleksiyonun da ele geçirmeleri arıyorum.

+0

Yani benim ilk satırı yukarıdaki küresel $ Hata toplama değiştirilir, ancak modül $ Hata koleksiyon değil kapsamlı .. yanlıştır. –

cevap

7

Bunu daha önce fark etmemiş, ama belki de $ hata koleksiyonu diğer değişkenler gibi modülüne de kapsamlı. Test komut kilit noktalarda aşağıdaki iki açıkça kapsamlı değişkenlerin değerlerini karşılaştırmayı deneyin:

"Errors - Global: {0}; Module: {1}" -f $global:error.count, $script:error.count 

Beni almak nasıl bildirin. tüm hataları görmek için hata:

+0

yerel alanla o $ error.clear() kopya küresel değişken ve bu temizler olabilir. –

+0

bir yol 'Get-Değişken -Name Hata KAPSAMI 2'FC olacağını modül kapsamında Hata değişkeni olsun. @Ethan, PS in Action'unuz olduğundan, 9.4.5 bölümüne bakmak isteyebilirsiniz. Skript modüllerinde kapsamlar nasıl çalışır? –

+0

Şimdi biraz aptalca hissediyorum ... Şu anda kontrol edemiyorum, ama kapsamın burada olması muhtemel olduğundan şüpheleniyorum. Tamamen aklımdan süzüldü (ki daha da kötüsü, bir kaç $ betiğim var çünkü: kodda kod var)! 9.4.5'i tekrar kontrol edeceğim - teşekkürler Andy!Bu durumda, bir modülde $ Error'a erişmenin mantıklı bir varsayılan kapsamı bulunmadığı sanırım - sonuçta, modülde bir istisna çıktı, bu yüzden $ Error'ın modüllerin hatalarının toplandığı diziye varsayılan hata olacağını düşünürdünüz . –

9

Ethan belirtildiği gibi, $ küresel bakmak gerekir. Modüller her zaman kendi $ error değişkenine sahiptir, ancak (çoğunlukla) kullanılmaz.

arka planı: bir noktada, biz modül kapsamına modül kodunda meydana gelen ancak bir bellek içi gibi hataların bir günlük (esasen olduğundan sonuçta küresel hata koleksiyonuna tüm hataları eklemeye karar hataları izole kabul etmişti eventlog.) Maalesef, kapsamdaki $ hata kapsamı, sürümden önce kaldırılmadı ve bu nedenle "gerçek" $ hata değişkenine erişmek için global kapsam niteleyicisini kullanmanız gerekiyor.

Bruce Payette, Microsoft Corporation

+0

Bruce - tarihi geçmiş için teşekkürler. Bu tam olarak aradığım bilgi tipidir. –

İlgili konular