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

时间:2019-02-10 21:27:51

标签: powershell error-handling exception-handling try-catch

我想处理脚本中每个命令的异常。为此,我正在为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 '['.

我试图解决它,但似乎没有任何效果。有办法吗?

2 个答案:

答案 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