PowerShell哈希表Add方法重复键错误类型及捕获疑问
PowerShell哈希表Add方法重复键错误的类型解析
当使用PowerShell哈希表的Add方法添加重复键时,会触发MethodInvocationException,示例如下:
PS(5.1.19041) C:\Users> $h = @{} PS(5.1.19041) C:\Users> $h.add('a',$null) PS(5.1.19041) C:\Users> $h.add('a',$null) Exception calling "Add" with "2" argument(s): "Item has already been added. Key in dictionary: 'a' Key being added: 'a'" At line:1 char:1 + $h.add('a',$null) + ~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ArgumentException
针对你的技术疑问,逐一解答:
1. 该错误属于终止错误还是非终止错误?
这个错误属于非终止错误。PowerShell默认会将.NET方法抛出的异常包装为非终止错误,不会中断后续代码的执行,这也是test-ht函数触发错误后仍能输出finished的原因。
2. 若为非终止错误,为何try/catch能抑制异常信息?
PowerShell的try/catch并非仅能捕获终止错误,它可以捕获所有可被PowerShell识别为可捕获的错误——包括默认状态下的非终止错误(只要该错误源自.NET异常或符合PowerShell的可捕获错误标准)。将Add方法调用放入try块时,PowerShell会将这个非终止错误视为可捕获异常,进入catch块处理,从而抑制了默认的错误输出。
3. 若为终止错误,为何test-ht函数在添加重复键后仍能执行完成?
该错误本身是非终止错误,默认不会中断执行流程。而使用-ErrorAction Stop时,相当于强制将这个非终止错误转换为终止错误,此时PowerShell会中断后续代码执行,函数也就提前终止了。
内容的提问来源于stack exchange,提问作者Blaisem
相关产品推荐
相关产品推荐

