2016-11-12 3 views
0

関数のエラーをメイン関数に伝播させずに処理するにはどうすればよいですか?中Powershellの関数内のトラップとハンドルのエラー

function main() { 
    trap { 
     "main caught it too!" 
    } 
    subroutine 
} 
function subroutine() { 
    trap { 
     "subroutine caught error" 
     Break 
    } 
    1/0 
} 
main 

結果:

subroutine caught error 
main caught it too! 
Attempted to divide by zero. 
... 

私はそれが自分の誤りだと私はグローバルなエラー処理の設定に$ErrorActionPreferenceを変更したり、-ErrorActionパラメータを設定するには、ユーザーに依存したくない処理するためにサブルーチンたいです。

+0

'Break' - >' Continue' – PetSerAl

+0

何をしますか休憩 - >続ける? – 4c74356b41

+0

@ 4c74356b41つまり、OPが 'Break'を' Continue'に変更する必要があることを意味します。なぜなら、 'trap'の' Break'は実際にはエラーハンドラがそれを処理しない限り、エラーをスクリプトが終了させるべきだからです。 – PetSerAl

答えて

-2

トラップハンドルのエラーが完全ではありません。あなたはそのためのtry{} catch{}を使用することができます。

function main() { 
try { 
    subroutine 
} 
catch{ 
    "main caught it too!" 
} 
} 
function subroutine() { 
try { 
    1/0 
} 
catch{ 
    "subroutine caught error" 
    Break 
} 
} 
main 
+0

あなたは自分と話していますか? – 4c74356b41

1

ブレーク文が文を続ける:

function main() { 
    trap { 
     "main caught it too!" 
    } 
    subroutine 
} 

function subroutine() { 
    trap { 
     "subroutine caught error" 
     continue 
    } 
    1/0; Write-host "I was executed after the ERROR" 
} 
main 
subroutine caught error 
I was executed after the ERROR 

それが十分でない場合にはrestless1987が推薦し@として、私はのtry/catchで行くだろう。

Windows IT Proは、というトラップに関する素晴らしい説明を与えます。

0

それは私が何を望むかの答えと思われる:さらにエラーを伝播することなく、サブルーチンを終了するにはReturn次のとおりです。

function main() { 
    trap { 
     "main caught it too!" # Will not happen 
    } 
    subroutine 
} 
function subroutine() { 
    trap { 
     "subroutine caught error" 
     Return 
    } 
    1/0 
    "this will not execute" 
} 
main 

出力:

subroutine caught error 
関連する問題