【问题标题】:Powershell 2: How to determine what exceptions a cmdlet can throw?Powershell 2:如何确定 cmdlet 可以抛出哪些异常?
【发布时间】:2011-11-12 10:07:00
【问题描述】:

回到我(有限的)java 编程时代,我记得这个不错的功能,如果我尝试进行可能引发异常的调用,java 将要求我处理该异常或将其传递给可以的东西。

无论如何,我正在编写一段与 Active Directory 中的对象混在一起的 powershell 代码,所以我要非常非常小心。我偶尔会遇到远程超时错误,这让我想到了一个更普遍的问题:

“我怎样才能提前知道这些 cmdlet 中的哪些可以引发指示危险情况的异常,以及这些可能的异常的列表是什么?”

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

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

谢谢!

【问题讨论】:

    标签: exception powershell error-handling


    【解决方案1】:

    嘿,我认为你一开始就走错了路。对于 Java 的检查异常是否是一个好主意,陪审团非常不同意。

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

    但是,如果您有 Active Directory 的专用模块(例如 Microsoft 的 ActiveDirectory 模块或 Quest 的 QAD 模块),那么他们可能已经列出了在支持系统中出现异常情况时其 cmdlet 将出现的异常。此帮助很可能在模块(或管理单元)帮助文件中或在每个 cmdlet 的基础上找到。尝试运行以下命令:

    ps> get-help do-something -full | more
    

    这将显示完整的调用语法以及开发人员认为足以祝福您的任何注释。特别注意页脚;在这里,您通常会找到更通用的帮助主题,例如“about_thesecmdlets”,您可以通过以下方式查看:get-help about_thesecmdlets

    希望这会有所帮助。

    【讨论】:

    • @xOn:很棒的回应,谢谢。您第二段的内容是我的直觉告诉我的-与多个后端系统有很多透明的交互,并且没有可靠的方法来知道可能发生的异常,或者至少得到一个有限的、可预测的、容易获得的列表。感谢您在最后一段中的建议。
    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多