我一直在努力扩展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行为上的不同?还是我做错了什么?
答案 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 {
"$_"
}