PowerShell: обнаружение ошибок в функциях сценария

Как лучше всего определить, возникает ли ошибка в функции скрипта? Я ищу последовательный способ указать статус ошибки / успеха, аналогичный $? (который работает только с командлетами, но не с функциями сценария.)

Учитывая, что конкретная функция может возвращать значение, которое будет использоваться вызывающим, мы не можем указать успех, возвращая логическое значение. Функция может использовать параметр [ref] и соответствующим образом устанавливать значение внутри функции и проверять после вызова, но это больше накладных расходов, чем хотелось бы. Есть ли что-то встроенное в PowerShell, которое мы можем использовать?

Лучшее, что я могу придумать, это:

  1. В функции используйте Write-Error для поместить объекты ErrorRecord в ошибку stream;
  2. вызвать функцию с Параметр ErrorVariable;
  3. проверьте, что параметр ErrorVariable не равно null после вызова.

Например:

function MyFun {
  [CmdletBinding()]    # must be an advanced function or this 
  param ()             # will not work as ErrorVariable will not exist
  process {
    # code here....
    if ($SomeErrorCondition) {
      Write-Error -Message "Error occurred; details..."
      return
    }
    # more code here....
  }
}

# call the function
$Err = $null
MyFun -ErrorVariable Err
# this check would be similar to checking if $? -eq $false
if ($Err -ne $null) {
  "An error was detected"
  # handle error, log/email contents of $Err, etc.
}

Есть что-нибудь получше? Есть ли способ использовать $? в наших скриптовых функциях? Я бы предпочел не бросать исключения или объекты ErrorRecord и не иметь кучу блоков try / catch повсюду. Я бы также предпочел не использовать $ Error, так как это потребует проверки счетчика перед вызовом функции, поскольку там могут быть другие ошибки перед вызовом - и я не хочу использовать Clear () и терять их.

10
задан DanW 21 June 2011 в 18:44
поделиться