[解決済み] Write-ErrorとThrowはいつ使い分ける?終端エラーと非終端エラー
質問
PoshCodeのGet-WebFileスクリプトを見ているところです。 http://poshcode.org/3226 私はこの奇妙な仕掛けに気づきました。
$URL_Format_Error = [string]"..."
Write-Error $URL_Format_Error
return
これに対して、次のような理由は何でしょうか。
$URL_Format_Error = [string]"..."
Throw $URL_Format_Error
あるいはもっといい。
$URL_Format_Error = New-Object System.FormatException "..."
Throw $URL_Format_Error
私の理解では、終了しないエラーにはWrite-Errorを、終了するエラーにはThrowを使うべきで、Write-Errorの後にReturnを使うべきではないように思えますが、いかがでしょうか?何か違いがあるのでしょうか?
どのように解決するのですか?
Write-Error
は、重大ではないエラーをユーザーに知らせたい場合に使用します。デフォルトでは、コンソールに赤い文字でエラーメッセージが表示されるだけです。パイプラインやループの継続を止めることはありません。
Throw
一方で、いわゆるターミネーティングエラーを発生させます。throwを使うと、パイプラインや現在のループが終了してしまいます。実際、すべての実行は、あなたが
trap
または
try/catch
構造体を用いて終了時のエラーを処理する。
1つだけ注意点があり、もしあなたが
$ErrorActionPreference
から
"Stop"
を使用し
Write-Error
となります。
終了エラー
.
リンク先のスクリプトには、このように書かれています。
if ($url.Contains("http")) {
$request = [System.Net.HttpWebRequest]::Create($url)
}
else {
$URL_Format_Error = [string]"Connection protocol not specified. Recommended action: Try again using protocol (for example 'http://" + $url + "') instead. Function aborting..."
Write-Error $URL_Format_Error
return
}
その関数の作者は、その関数の実行を停止して画面にエラーメッセージを表示したかったようですが、スクリプト全体の実行を停止させたくはなかったようです。スクリプトの作者は
throw
を使用する必要があります。
try/catch
を呼び出すと、その関数が表示されます。
return
は、関数、スクリプト、スクリプトブロックなどの現在のスコープを終了します。これは、コードで説明するのが一番わかりやすいでしょう。
# A foreach loop.
foreach ( $i in (1..10) ) { Write-Host $i ; if ($i -eq 5) { return } }
# A for loop.
for ($i = 1; $i -le 10; $i++) { Write-Host $i ; if ($i -eq 5) { return } }
両方に出力します。
1
2
3
4
5
ここで一つ注意しなければならないのは
return
と
ForEach-Object
. 期待するような処理の破綻はありません。
詳細はこちら
-
$ErrorActionPreference
: プリファレンス変数について -
try/catch
: について_Try_Catch_Finally -
trap
: トラップについて -
throw
: 投げる -
return
: 約_リターン
関連
-
[解決済み】powershellにターミネーターがない。"
-
[解決済み】PowerShellの関数で変数をインクリメントする
-
[解決済み] ConvertTo-Csv 引用符なしの出力
-
[解決済み] 管理者として実行しても、「要求されたレジストリへのアクセスは許可されません」と表示される。
-
[解決済み] PowerShell モジュールを全ユーザーに持続的にインストールする
-
[解決済み] PowerShellで文字列がifで始まる場合 [重複]。
-
[解決済み] PowerShell:PowerShellで配列オブジェクトを文字列に変換するにはどうすればよいですか?
-
[解決済み] Install-Module : 'Install-Module' という用語は、コマンドレット名として認識されません。
-
[解決済み】 `throw new Error` と `throw someObject` の違いは何ですか?
-
[解決済み】PowerShellで何かを出力する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PowerShellの関数で変数をインクリメントする
-
[解決済み】'<'演算子は将来の使用のために予約されている
-
[解決済み] ConvertTo-Csv 引用符なしの出力
-
[解決済み] リモートサーバーへのEnter-PSSessionが "access is denied "で失敗する。
-
[解決済み] PowerShell起動時に「動的操作はhomogenous appdomainでしか実行できない」エラーが発生する。
-
[解決済み] Resolve-Pathコマンドレットは、具体的にどのような処理を行うのですか?
-
[解決済み] PowerShellで"%"(パーセント)は何をするのですか?
-
[解決済み] Windows PowerShellでファイルが存在するかどうかをチェックする?
-
[解決済み] グローバル変数名が関数に渡された変数である関数からPowerShellのグローバル変数を設定する
-
[解決済み】最初のエラーでPowerShellスクリプトを停止する方法は?