如何使用变量来存储 catch 块的错误类型?

How to use variable to store error type for catch block?

我想处理脚本中每个命令的异常。为此,我正在为 try..catch 编写一个函数。此函数有两个参数:$command,要执行的命令,和 $errorTypecatch 块中指定的可选错误类型。

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