Как использовать переменную для хранения типа ошибки для блока catch? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу обработать исключения для каждой команды в моем скрипте.С этой целью я пишу функцию для 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 голосов
/ 11 февраля 2019

Короткий ответ, я не верю, что вы можете делать то, что пытаетесь.Давайте посмотрим, как я понимаю сценарий.

Параметр для блока 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."
}

Проще говоряset.

Теперь мы обычно видим эти типы жестко запрограммированными, но вы хотели бы динамически назначать тип в блоке catch в виде переменной:

try {
   ...
} catch $exceptionType {
   catchError
}

Проблема заключается в потребностях catchследовать за типом исключения, а не переменной.Эта переменная будет (если она содержит тип исключения) типа RuntimeType.Вы можете попытаться найти тип исключения из переменной с помощью GetType () или чего-то в этом роде.Net-net, это просто не будет работать.

Поместите универсальный блок catch (без типа) в вашу функцию-скрипт - что угодно, затем передайте значения в вашу функцию catch, и там будет логика ветвленияделайте все, что вы пытаетесь сделать.

try { ... } catch { catchError -Command $command -Exception $_ }

И, если вы не хотите передавать весь объект исключения, вы можете использовать ...

$_.FullyQualifiedErrorId
0 голосов
/ 11 февраля 2019

Я не думаю, что вы можете использовать переменную, чтобы указать тип для ловли.Что вы можете сделать, так это использовать условие внутри блока 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])
...