PowerShell Try/Catch Rethrowが伝播しないエラー(PowerShell 2.0)
-
10-10-2019 - |
質問
トライキャッチステートメント内にトライキャッチステートメントがあります。内側のキャッチはエラーをキャッチしますが、スローはOUT CACTステートメントにエラーをキャッチしません。 Breifly、私のスクリプトは次のようにフォーマットされています:
$ErrorPreference = "Stop"
try
{
getStuffFromDB
putStuffInDB
}
catch
{
write-host ("Error: " + $error[0])
}
function getStuffFromDB
{
try
{
-- database query statement
}
catch
{
throw
}
finally
{
close connection and clean up
}
}
function putStuffInDB
{
try
{
-- database insert statements statement
}
catch
{
throw
}
finally
{
close connection and clean up
}
}
スクリプトを実行したとき、エラーはありませんでしたが、設定しようとしているSQL Serverデータベースがデータが欠落していることに気付きました。デバッグでスクリプトを再ランすると、関数「putstuffindb」にはキャッチブロックに巻き込まれたエラーがありました。しかし、私が踏み込んだとき、メッセージは外側のキャッチブロックに「投げられた」のではなく、最終的なブロックを処理して終了しました。
私は明らかに私が見ていないものを見逃しています。私は過去にC#でコンストラクトを使用しましたが、エラーが外側のキャッチブロックに「渡される」という問題はありませんでした。
解決 3
私は問題が私自身のことであることに気づきました。 SQLServerエントリを作成するためのPosh機能では、作成されたデータセットの主要なキーを返しました。関数の設計は、関数が主キーを返すようなものでした。デザインの間違いは、私が最終的なブロックにリターンステートメントを入れて、スローを外側のキャッチに戻したことでした。リターンステートメントを削除するデザインを変更しました。トライ/キャッチが正しく機能するようになりました。
他のヒント
私はその行動を見ていません。 PowerShell ISEで以下を実行しましたが、予想される結果が生成されます。データベースのエラーが実際に例外としてスローされなかった可能性はありますか?たとえば、SQL Serverでは、特定のエラーレベルでの特定のエラーは、ADO.NETプロバイダーに戻る例外としてスローされていません。
$ErrorActionPreference = 'Stop'
function Throw1 {
try {
Write-Host "Throw1.Try"
throw "Error from Throw1"
}
catch {
Write-Host "Throw1.Catch"
throw
}
finally {
Write-Host "Throw1.Finally"
}
}
function Throw2 {
try {
Write-Host "Throw2.Try"
throw "Error from Throw2"
}
catch {
Write-Host "Throw2.Catch"
throw
}
finally {
Write-Host "Throw2.Finally"
}
}
function Test {
try {
Throw1
Throw2
}
catch {
Write-Host $error[0]
}
}
Test
以下を生成します。
Throw1.Try
Throw1.Catch
Throw1.Finally
Error from Throw1
設定する変数は、$ errorpreferenceではなく、$ erroractionPreferenceです。
(ジョシュは適切な変数を設定しました。)