如何使用变量来存储 catch 块的错误类型?
How to use variable to store error type for catch block?
我想处理脚本中每个命令的异常。为此,我正在为 try..catch
编写一个函数。此函数有两个参数:$command
,要执行的命令,和 $errorType
,catch
块中指定的可选错误类型。
function tryCatch ($command, $errorType) {
try {
$command
} catch [$errorType] {
# function to be called if this error type occurs
catchError
}
}
但是我不知道如何将错误类型作为变量传递给 catch 块。我收到此错误:
在 \script.ps1:233 char:25
+ 尝试 {$command} 捕获 [$errorType] {catchError}
+ ~
“[”后缺少类型名称。
我试图绕过它,但似乎没有任何效果。有办法吗?
我认为您不能使用变量来指定要捕获的类型。您可以做的是在 catch
块内使用条件:
function Invoke-Something($command, [Object]$errorType) {
try {
$command
} catch {
if ($_.Exception -is $errorType) {
catchError
} else {
# do something else
}
}
}
Invoke-Something 'whatever the command' ([System.IO.IOException])
简短的回答,我不相信你能做你想做的事。让我演练一下,以确保我理解场景。
catch
块的参数是一种或多种异常类型,例如 System.Net.WebException
:
try {
$wc = new-object System.Net.WebClient
$wc.DownloadFile("http://www.contoso.com/MyDoc.doc")
} catch [System.Net.WebException], [System.IO.IOException] {
"Unable to download MyDoc.doc from http://www.contoso.com."
} catch {
"An error occurred that could not be resolved."
}
说这些只是为了水平设置。
现在,我们通常看到这些类型是硬编码的,但您希望将 catch 块中的类型动态分配为变量:
try {
...
} catch $exceptionType {
catchError
}
问题是 catch 后面需要跟一个异常类型而不是变量。该变量(如果它承载异常类型)将是 RuntimeType 类型。您可以尝试使用 GetType() 或类似的东西从变量中骗取异常类型。网网,就是不行。
在你的脚本函数中放置一个通用的 catch 块(没有类型),然后将值传递给你的 catch 函数,并让分支逻辑在那里做你想做的任何事情。
try { ... } catch { catchError -Command $command -Exception $_ }
而且,如果你不想传递整个异常对象,你可以使用...
$_.FullyQualifiedErrorId
我想处理脚本中每个命令的异常。为此,我正在为 try..catch
编写一个函数。此函数有两个参数:$command
,要执行的命令,和 $errorType
,catch
块中指定的可选错误类型。
function tryCatch ($command, $errorType) {
try {
$command
} catch [$errorType] {
# function to be called if this error type occurs
catchError
}
}
但是我不知道如何将错误类型作为变量传递给 catch 块。我收到此错误:
在 \script.ps1:233 char:25 + 尝试 {$command} 捕获 [$errorType] {catchError} + ~ “[”后缺少类型名称。
我试图绕过它,但似乎没有任何效果。有办法吗?
我认为您不能使用变量来指定要捕获的类型。您可以做的是在 catch
块内使用条件:
function Invoke-Something($command, [Object]$errorType) {
try {
$command
} catch {
if ($_.Exception -is $errorType) {
catchError
} else {
# do something else
}
}
}
Invoke-Something 'whatever the command' ([System.IO.IOException])
简短的回答,我不相信你能做你想做的事。让我演练一下,以确保我理解场景。
catch
块的参数是一种或多种异常类型,例如 System.Net.WebException
:
try {
$wc = new-object System.Net.WebClient
$wc.DownloadFile("http://www.contoso.com/MyDoc.doc")
} catch [System.Net.WebException], [System.IO.IOException] {
"Unable to download MyDoc.doc from http://www.contoso.com."
} catch {
"An error occurred that could not be resolved."
}
说这些只是为了水平设置。
现在,我们通常看到这些类型是硬编码的,但您希望将 catch 块中的类型动态分配为变量:
try {
...
} catch $exceptionType {
catchError
}
问题是 catch 后面需要跟一个异常类型而不是变量。该变量(如果它承载异常类型)将是 RuntimeType 类型。您可以尝试使用 GetType() 或类似的东西从变量中骗取异常类型。网网,就是不行。
在你的脚本函数中放置一个通用的 catch 块(没有类型),然后将值传递给你的 catch 函数,并让分支逻辑在那里做你想做的任何事情。
try { ... } catch { catchError -Command $command -Exception $_ }
而且,如果你不想传递整个异常对象,你可以使用...
$_.FullyQualifiedErrorId