2016-07-17 7 views
18
Invoke-WebRequest $sumoApiURL -Headers @{"Content-Type"= "application/json"} -Credential $cred -WebSession $webRequestSession -Method post -Body $sumojson -ErrorAction Stop 

これは、次の例外がスローされます。キャッチFULL例外メッセージ

enter image description here

は、どのように私は完全にそれをキャッチしたり、少なくとも「同じ名前のリソースは既に存在しているの。」フィルタリングすることができますか? $_.Exception.GetType().FullName利回り

System.Net.WebException

$_.Exception.Messageを使用して

は、私はそれを見つけた

The remote server returned an error: (400) Bad Request.

答えて

37

エラーと例外が構造化されたオブジェクトであるで見ることができます。コンソールに表示されるエラーメッセージは、実際には、エラー/例外オブジェクトのいくつかの要素の情報を含む書式付きメッセージです。

:あなたはちょうどあなたは、単に(その時点でエラーを保持している)現在のオブジェクト変数をエコーすることができ、あなたの 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 
} 
+0

Iすでに回答が見つかりましたが、これははるかに詳細です。乾杯。 – JustAGuy

+0

徹底的な説明をありがとう。非常に便利。 –

6

を与えます!

最後のエラーメッセージとして$Error[0]を印刷してください。

3

あなたは

-ErrorVariable errvar 

を追加して、PowerShellで$ errvar