Exception Powershell 2:如何确定cmdlet可以引发哪些异常?

Exception Powershell 2:如何确定cmdlet可以引发哪些异常?,exception,powershell,error-handling,Exception,Powershell,Error Handling,回到我的(有限的)java编程时代,我记得这个很好的特性,如果我试图发出一个可能引发异常的调用,java将要求我处理该异常或将其传递给可能引发异常的东西 无论如何,我正在写一段powershell代码,它会把Active Directory中的对象弄得乱七八糟,所以我要非常非常小心。我偶尔会遇到远程超时错误,这让我想到了一个更一般的问题: “我如何提前知道这些cmdlet中哪些可以抛出指示危险条件的异常,以及这些可能的异常的列表是什么?” 我想知道每个cmdlet的异常列表是否太长,无法解决所有

回到我的(有限的)java编程时代,我记得这个很好的特性,如果我试图发出一个可能引发异常的调用,java将要求我处理该异常或将其传递给可能引发异常的东西

无论如何,我正在写一段powershell代码,它会把Active Directory中的对象弄得乱七八糟,所以我要非常非常小心。我偶尔会遇到远程超时错误,这让我想到了一个更一般的问题:

“我如何提前知道这些cmdlet中哪些可以抛出指示危险条件的异常,以及这些可能的异常的列表是什么?”

我想知道每个cmdlet的异常列表是否太长,无法解决所有可能的问题。我也不想只编写一个通用的异常处理程序,因为powershell在错误处理的一般意义上似乎还可以

根据cmdlet,确定可能发生的所有异常列表的最佳方法是什么?这是否可能/可行


谢谢

嘿,我想你一开始就错了。对于Java的检查异常是否是一个好主意,陪审团的意见非常分歧

也就是说,你的问题很难回答。在Java中,通过静态分析,编译器可以清楚地知道哪些方法抛出(或者至少是它们声明将抛出什么)哪些异常;这是一个仅存在于编译器进程空间中的封闭系统。在分布式异构系统的现实世界中,没有通用的检查异常框架。PowerShell cmdlet存在于win32进程中的.NET appdomain域中,但它们使用诸如Active Directory之类的迟钝协议与外国服务器上的支持系统进行通信,这些协议在实现和一般概念上都是天壤之别。异常情况可能会从一个域“流动”到下一个域,但它们会被扭曲、包裹并向各个方向挤压,直到它们冒出泡沫,出现在控制台上的可怜用户您面前。简言之,答案是否定的。通用cmdlet(get-item、get-childitem)不知道底层提供程序系统导致错误的倾向,也不能可靠地知道这一点

但是,如果您有一个用于Active Directory的专用模块(如Microsoft的Active Directory模块或Quest的QAD模块),则他们可能列出了在备份系统中出现异常情况时其cmdlet将出现的异常。此帮助很可能位于模块(或管理单元)帮助文件中,或者基于每个cmdlet。尝试运行以下命令:

ps> get-help do-something -full | more
这将显示完整的调用语法,以及开发人员觉得足够好的注释。特别注意页脚;在这里,您通常会找到一个更一般的帮助主题,如“about thescmdlet”,您可以使用它查看:
get help about thescmdlet


希望这能有所帮助。

@xOn:非常好的回答,谢谢。你第二段的内容是我的直觉告诉我的——有很多与多个后端系统的透明交互,没有可靠的方法知道会发生什么异常,或者至少没有一个有限的、可预测的、容易获得的列表。谢谢你最后一段的建议。