在Powershell中引发带有嵌套原始错误的异常

Ser*_*kov 7 powershell

我是一位C#开发人员,他正在尝试使用PowerShell构建有用的东西。这就是为什么我一直试图在PowerShell中使用来自.NET世界的著名习语的原因。

我正在编写一个具有不同抽象层的脚本:数据库操作,文件操作等。在某些时候,我想捕获一个错误并将其包装为对最终用户更有意义的东西。这是C#/ Java / C ++代码的常见模式:

Function LowLevelFunction($arg)
{
  # Doing something very useful here!
  # but this operation could throw
  if (!$arg) {throw "Ooops! Can't do this!"}
}
Run Code Online (Sandbox Code Playgroud)

现在,我想调用此函数并包装一个错误:

Function HighLevelFunction
{
  Try
  {
     LowLevelFunction
  }
  Catch
  {
     throw "HighLevelFunction failed with an error!`nPlease check inner exception for more details!`n$_"
  }
}
Run Code Online (Sandbox Code Playgroud)

这种方法几乎是我所需要的,因为HighLevelFunction它将引发新的错误,而原始错误的根本原因将会丢失!

在C#代码中,我总是可以抛出新的异常并将原始异常作为内部异常提供。在这种情况下,HighLevelFunction将能够以对他们的客户更有意义的形式传达他们的错误,但仍将提供内部细节以用于诊断目的。

在PowerShell中打印原始异常的唯一方法是使用$Error存储所有异常的变量。可以,但是我脚本的用户(现在是我自己)应该做更多我想做的事情。

所以问题是:有什么方法可以在PowerShell中引发异常并将原始错误提供为内部错误?

Ben*_*est 3

您可以在块中引发新异常catch并指定基本异常:

# Function that will throw a System.IO.FileNotFoundExceptiopn
function Fail-Read {
  [System.IO.File]::ReadAllLines( 'C:\nonexistant' )
}

# Try to run the function
try {
  Fail-Read
} catch {
  # Throw a new exception, specifying the inner exception
  throw ( New-Object System.Exception( "New Exception", $_.Exception ) )
}

# Check the exception here, using getBaseException()
$error[0].Exception.getBaseException().GetType().ToString()
Run Code Online (Sandbox Code Playgroud)