Występuje specyficzny problem z Powershell. Przechwytywam wyjątek w bloku catch, ale globalny obiekt błędu $ nie jest wypełniany.
trywialny przykład, gdzie byłoby to zachowują się zgodnie z oczekiwaniami to:
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)"
}
}
wyjściowy jest jak można się spodziewać, jeśli dzwonisz Bar
Caught an error - current error count 1
Cleaning up - current error count 1
Kodeksu mam problemy z jest prawie identyczne, z wyjątkiem tego, że ładuje Foo z modułu. Nie wiem, czy jest to błąd, czy po prostu coś, czego nie rozumiem (będzie musiał sprawdzić mój PowerShell w książce działania!)
Gdybym zapisać Foo się do modułu - 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
Potem należy wykonać następujące
Import-Module .\Foo.psm1
$Error.Clear()
"Current error count $($Error.Count)"
Foo
"Current error count $($Error.Count)"
I skończyć z
Current error count 0
Caught an error - current error count 0
Cleaning up - current error count 0
Current error count 1
Zauważ, że Foo nie widzi Niu zmiany wprowadzone do $ Błąd. Tak więc moduł-ification kodu zmienia zachowanie propagacji błędu. Czy ktokolwiek może wtrącić się za tym rozumowaniem?
Powinienem zauważyć, że mogę uzyskać określony wyjątek odłowu za pomocą zmiennej automatycznej $ _, ale szukam, aby uzyskać cały zbiór w tym momencie stosu wywołań.
Więc moja pierwsza linia powyżej jest nie tak .. globalny zbiór $ Błąd został zmodyfikowany, ale moduł scoped kolekcja $ Błąd nie jest. –