質問

トライキャッチステートメント内にトライキャッチステートメントがあります。内側のキャッチはエラーをキャッチしますが、スローは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です。

(ジョシュは適切な変数を設定しました。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top