gpt4 book ai didi

powershell - 捕获完整的异常消息

转载 作者:行者123 更新时间:2023-12-02 23:37:13 24 4
gpt4 key购买 nike

考虑:

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

这会引发以下异常:

Enter image description here

如何完全捕获它或至少过滤掉“同名资源已存在。”?

使用$_.Exception.GetType().FullName 产生

System.Net.WebException

$_.Exception.Message给出

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

最佳答案

PowerShell 中的错误和异常是结构化对象。您在控制台上看到的错误消息实际上是一条格式化消息,其中包含来自错误/异常对象的多个元素的信息。您可以像这样(重新)自己构建它:

$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

如果您只想在 catch block 中显示错误消息,您可以简单地回显当前对象变量(它保存此时的错误):

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 错误可能有些通用)。您可以使用如下方式展开这些嵌套异常:

$e = $_.Exception
$msg = $e.Message
while ($e.InnerException) {
$e = $e.InnerException
$msg += "`n" + $e.Message
}
$msg

在您的情况下,您想要提取的信息似乎位于 $_.ErrorDetails.Message 中。我不太清楚那里是否有对象或 JSON 字符串,但您应该能够通过运行

$_.ErrorDetails 成员的类型和值的信息>
$_.ErrorDetails | Get-Member
$_.ErrorDetails | Format-List *

如果 $_.ErrorDetails.Message 是一个对象,您应该能够获取如下消息字符串:

$_.ErrorDetails.Message.message

否则您需要先将 JSON 字符串转换为对象:

$_.ErrorDetails.Message | ConvertFrom-Json | Select-Object -Expand message

根据您正在处理的错误类型,特定类型的异常还可能包含有关当前问题的更具体信息。例如,在您的情况下,您有一个 WebException,除了错误消息 ($_.Exception.Message) 之外,还包含来自服务器的实际响应:

PS C:\> $e.Exception | Get-Member   TypeName: System.Net.WebExceptionName             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;}

which provides you with information like this:

PS C:\> $e.Exception.ResponseIsMutuallyAuthenticated : FalseCookies                 : {}Headers                 : {Keep-Alive, Connection, Content-Length, Content-T...}SupportsHeaders         : TrueContentLength           : 198ContentEncoding         :ContentType             : text/html; charset=iso-8859-1CharacterSet            : iso-8859-1Server                  : Apache/2.4.10LastModified            : 17.07.2016 14:39:29StatusCode              : NotFoundStatusDescription       : Not FoundProtocolVersion         : 1.1ResponseUri             : http://www.example.com/Method                  : POSTIsFromCache             : False

Since not all exceptions have the exact same set of properties you may want to use specific handlers for particular exceptions:

try {
...
} catch [System.ArgumentException] {
# handle argument exceptions
} catch [System.Net.WebException] {
# handle web exceptions
} catch {
# handle all other exceptions
}

如果您有无论是否发生错误都需要完成的操作(清理任务,例如关闭套接字或数据库连接),您可以将它们放在异常之后的 finally block 中处理:

try {
...
} catch {
...
} finally {
# cleanup operations go here
}

关于powershell - 捕获完整的异常消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38419325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com