我想处理脚本中每个命令的异常。为此,我正在为try..catch
写一个函数。此函数有两个参数:$command
(要执行的命令)和$errorType
(在catch
块中指定的可选错误类型。
function tryCatch ($command, $errorType) {
try {
$command
} catch [$errorType] {
# function to be called if this error type occurs
catchError
}
}
但是我不知道如何将错误类型作为变量传递给catch块。我收到此错误:
At \script.ps1:233 char:25 + try {$command} catch [$errorType] {catchError} + ~ Missing type name after '['.
我试图解决它,但似乎没有任何效果。有办法吗?
答案 0 :(得分:1)
我认为您不能使用变量来指定要捕获的类型。您可以做的是在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])
答案 1 :(得分:0)
简短的回答,我不相信您可以做您想做的事情。演练只是为了确保我了解这种情况。
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