エラーと例外が構造化されたオブジェクトであるで見ることができます。コンソールに表示されるエラーメッセージは、実際には、エラー/例外オブジェクトのいくつかの要素の情報を含む書式付きメッセージです。
:あなたはちょうどあなたは、単に(その時点でエラーを保持している)現在のオブジェクト変数をエコーすることができ、あなたの
catch
ブロックに表示されるエラーメッセージが必要な場合
$formatstring = "{0} : {1}`n{2}`n" +
" + CategoryInfo : {3}`n" +
" + FullyQualifiedErrorId : {4}`n"
$fields = $_.InvocationInfo.MyCommand.Name,
$_.ErrorDetails.Message,
$_.InvocationInfo.PositionMessage,
$_.CategoryInfo.ToString(),
$_.FullyQualifiedErrorId
$formatstring -f $fields
:あなたは(再)このようにそれを自分で構築することができます
try {
...
} catch {
$_
}
前述したように、あなたがフォーマットされた文字列との色の出力に使用Write-Host
が必要な場合:
try {
...
} catch {
...
Write-Host -Foreground Red -Background Black ($formatstring -f $fields)
}
ということで、通常、あなたドン例外ハンドラにそのままエラーメッセージを表示したい(そうでなければ、-ErrorAction Stop
は無意味です)。構造化されたエラー/例外オブジェクトは、優れたエラー制御のために使用できる追加情報を提供します。たとえば、実際のエラー番号と$_.Exception.HResult
があります。 $_.ScriptStackTrace
と$_.Exception.StackTrace
であるため、デバッグ時にスタックトレースを表示できます。 $_.Exception.InnerException
は、エラーに関する追加情報を含むことが多いネストされた例外(最上位のPowerShellエラーは多少一般的な可能性があります)にアクセスできるようにします。あなたが抽出したい情報が$_.ErrorDetails.Message
内にあるように見え、あなたの場合は
$e = $_.Exception
$msg = $e.Message
while ($e.InnerException) {
$e = $e.InnerException
$msg += "`n" + $e.Message
}
$msg
:あなたはこのようなもので、これらのネストされた例外をアンロールすることができます。あなたがそこにオブジェクトやJSON文字列を持っている場合、それは私に非常に明確ではありませんが、$_.ErrorDetails.Message
がオブジェクトあなたの場合、あなたは
$_.ErrorDetails | Get-Member
$_.ErrorDetails | Format-List *
を実行することにより、$_.ErrorDetails
のメンバーのタイプと値についての情報を得ることができる必要がありますこのようなメッセージ文字列を取得することができるはずです。
$_.ErrorDetails.Message.message
そうでなければ、最初のオブジェクトにJSON文字列を変換する必要があります。
$_.ErrorDetails.Message | ConvertFrom-Json | Select-Object -Expand message
処理しているエラーの種類にもよりますが、特定のタイプの例外には、現在の問題に関するより具体的な情報が含まれている場合があります。
PS C:\>$e.Exception | Get-Member
TypeName: System.Net.WebException
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj), bool _Exception.E...
GetBaseException Method System.Exception GetBaseException(), System.Excep...
GetHashCode Method int GetHashCode(), int _Exception.GetHashCode()
GetObjectData Method void GetObjectData(System.Runtime.Serialization.S...
GetType Method type GetType(), type _Exception.GetType()
ToString Method string ToString(), string _Exception.ToString()
Data Property System.Collections.IDictionary Data {get;}
HelpLink Property string HelpLink {get;set;}
HResult Property int HResult {get;}
InnerException Property System.Exception InnerException {get;}
Message Property string Message {get;}
Response Property System.Net.WebResponse Response {get;}
Source Property string Source {get;set;}
StackTrace Property string StackTrace {get;}
Status Property System.Net.WebExceptionStatus Status {get;}
TargetSite Property System.Reflection.MethodBase TargetSite {get;}
このような情報を提供します:例えば、あなたのケースでは、エラーメッセージ($_.Exception.Message
)に加えて、サーバーからの実際の応答が含まれているWebException
を持って
PS C:\>$e.Exception.Response
IsMutuallyAuthenticated : False
Cookies : {}
Headers : {Keep-Alive, Connection, Content-Length, Content-T...}
SupportsHeaders : True
ContentLength : 198
ContentEncoding :
ContentType : text/html; charset=iso-8859-1
CharacterSet : iso-8859-1
Server : Apache/2.4.10
LastModified : 17.07.2016 14:39:29
StatusCode : NotFound
StatusDescription : Not Found
ProtocolVersion : 1.1
ResponseUri : http://www.example.com/
Method : POST
IsFromCache : False
ので、すべての例外が特定の例外に対して特定のハンドラを使用する場合と同じプロパティセットを持つわけではありません。
try {
...
} catch [System.ArgumentException] {
# handle argument exceptions
} catch [System.Net.WebException] {
# handle web exceptions
} catch {
# handle all other exceptions
}
あなたは関係なく、エラーが(ソケットまたはデータベース接続を閉じるなどのクリーンアップタスク)発生したかどうかの実行する必要の操作を持っている場合は、例外処理後finally
ブロックにそれらを置くことができます。
try {
...
} catch {
...
} finally {
# cleanup operations go here
}
Iすでに回答が見つかりましたが、これははるかに詳細です。乾杯。 – JustAGuy
徹底的な説明をありがとう。非常に便利。 –