2

try-catch ステートメント内に try-catch ステートメントがあります。内側の catch はエラーをキャッチしますが、スローによってエラーが out catch ステートメントでキャッチされることはありません。簡単に言うと、私のスクリプトは次のようにフォーマットされています。

$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」にエラーがあり、catch ブロックでキャッチされました。しかし、私がステップしたとき、メッセージは外側の catch ブロックに「スロー」されませんでしたが、finally ブロックを処理して終了しました。

私は明らかに、私が見ていないものを見逃しています。過去に C# でこの構造を使用したことがありますが、エラーが外側の catch ブロックに「渡される」という問題はありませんでした。

4

3 に答える 3

5

私はその振る舞いを見ていません。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
于 2010-12-16T02:17:15.553 に答える
1

問題は自分のせいだと気づきました。SQLServer エントリを作成する POSH 関数で、作成したデータ セットの主キーを返しました。関数の設計は、関数が主キーを返すようになっていました。設計ミスは、外側のキャッチへのスロー バックに取って代わった、finally ブロックに return ステートメントを入れたことです。return ステートメントを削除して設計を変更しました。try/catch が正しく機能するようになりました。

于 2010-12-17T20:12:37.737 に答える
1

設定する変数は、$ErrorPreference ではなく、$ErrorActionPreference です。

(Josh は正しい変数を設定しました。)

于 2010-12-16T16:52:52.153 に答える