【问题标题】:Extending Exceptions in Powershell with default message使用默认消息在 Powershell 中扩展异常
【发布时间】:2020-06-08 13:36:53
【问题描述】:

我一直在尝试在 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 中的行为差异?还是我做错了什么?

【问题讨论】:

  • 很奇怪,将: base("default message") 添加到默认构造函数对我来说效果很好。您使用的是哪个版本的 PowerShell?
  • @mathias-r-jessen 我在 5.1。我终于摆脱了 2.0,但我不能强迫人们进入 Core。
  • 我刚刚注意到缺少什么,请看我的回答

标签: powershell exception extending


【解决方案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 {
    "$_"
}

【讨论】:

  • @mathias-r-jessen 啊,很有趣。我是否理解这是 Powershell 独有的,还是 C# 示例中没有提到的细微差别?而且,最好的做法是始终是这样的构造函数,还是 throw [System.IO.FileNotFoundException] 完全有效,只要获取类型名称作为消息是可以接受的?为了保持一致性,感觉我可能也想使用throw [CustomException]::new('Another message')
  • throw [System.IO.FileNotFoundException] 实际上会导致 throw 'System.IO.FileNotFoundException' - 它是有效的,但它实际上并没有抛出您期望的类型的异常
  • @mathias-r-jessen 是因为 [System.IO.FileNotFoundException] 通过 .ToString() 解析为字符串吗?没那么重要,因为我想知道我是否终于开始理解东西了。
  • @Gordon 是的,没错! throw 只接受三种类型的参数:ErrorRecord's、Exception's 或字符串,所以如果不是前两者之一,powershell 将转换为字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 2018-08-19
  • 2015-02-15
  • 2022-12-04
  • 2016-11-26
  • 1970-01-01
  • 2015-11-18
相关资源
最近更新 更多