使用默认消息扩展Powershell中的异常

时间:2020-06-08 13:36:53

标签: powershell exception extending

我一直在努力扩展PowerShell中的异常。我第一次上课是这样的...

class CustomException : Exception {
    CustomException () {
    }
    CustomException ([String] $message) : base ($message) {
    }
}

使用符合预期,第一种方法产生类型名称,第二种提供消息...

try {
    throw [CustomException]
} catch {
    "$($_.Exception.Message)"
}
try {
    throw [CustomException] 'Another message'
} catch {
    "$($_.Exception.Message)"
}

但是,我确实希望有一个默认消息,因此我可以在许多地方使用第一个示例,但是如果我想修改消息,则可以在全班一次。甚至可能在某个时候将消息本地化。 This thread似乎暗示在C#中是可能的,尤其是最后两篇文章。所以,以那里的最后一个例子...

public class MyException : Exception
{
    public MyException () : base("This is my Custom Exception Message")
    {
    }
}

我以为我可以在Powershell中做同样的事情……

CustomException () : base ('Default message') {
}

但是当不提供消息时,我仍然得到类型名称。那让我开始思考,然后我尝试了...

try {
    throw [System.IO.FileNotFoundException]
} catch {
    "$($_.Exception.Message)"
}

该ALSO也不提供默认消息,仅提供类名。那么,C#代码没有按照我认为的去做吗?还是这只是Powershell行为上的不同?还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

您想要的东西得到了完美的支持,但是您需要抛出该异常的一个实例!

throw的语法基本上是:

throw [Throwable]

其中Throwable是ErrorRecord,Exception或字符串(基本上是一条简单的错误消息)。

当您抛出类型文字[CustomException]时,PowerShell将该表达式转换为[string],这就是为什么您只在catch块中看到类型名称的原因。

正确抛出异常实例需要您调用构造函数:

class CustomException : Exception
{
  CustomException() : base("default CustomException message goes here")
  {
  }
}

try {
    throw [CustomException]::new()    # <-- don't forget to call the constructor
} catch {
    "$_"
}