Powershell 2: как определить, какие исключения может выдавать командлет? - PullRequest
5 голосов
/ 07 сентября 2011

В свои (ограниченные) дни программирования на Java я помню эту замечательную функцию, когда, если бы я попытался сделать вызов, который мог бы вызвать исключение, java потребовал бы, чтобы я обработал это исключение или передал его чему-то, что могло бы

В любом случае, я пишу фрагмент кода PowerShell, который смешивается с объектами в Active Directory, поэтому я хочу быть очень, очень осторожным. Я иногда получаю ошибки удаленного тайм-аута, и это приводит меня к более общему вопросу:

«Как я могу заранее узнать, какой из этих командлетов может генерировать исключения, указывающие на опасные условия, и каков список этих возможных исключений?»

Мне интересно, является ли список исключений для каждого командлета слишком длинным, чтобы охватить все возможности. Я также не хочу просто писать общий обработчик исключений, так как powershell, похоже, работает нормально в общем смысле обработки ошибок.

Какой лучший способ для каждого командлета определить список всех исключений, которые могут возникнуть? Это вообще возможно / возможно?

Спасибо!

1 Ответ

7 голосов
/ 08 сентября 2011

Хех, я думаю, что вы начали не с той ноги. Жюри очень много о том, являются ли проверенные исключения Java хорошей идеей.

Тем не менее, на то, что вы спрашиваете, очень трудно ответить. В Java для статического анализа компилятору ясно, какие методы выдают (или, по крайней мере, то, что они объявляют , которые они выдают), какие исключения; это закрытая система, существующая исключительно в пространстве процессов компилятора. В реальном мире распределенных гетерогенных систем не существует универсальной системы проверенных исключений. Командлеты PowerShell существуют в домене приложения .NET в процессе win32, но они взаимодействуют с системами поддержки на внешних серверах, используя тупые протоколы, такие как Active Directory, которые отличаются друг от друга как в реализации, так и в общей концепции. Исключительные условия могут «перетекать» из одного домена в другой, но они деформируются, оборачиваются и перемешиваются во всех направлениях, прежде чем всплывают перед вами, бедным пользователем на консоли. Короче говоря, ответ - нет. Командлеты общего назначения (get-item, get-childitem) не знают о склонности базовой провайдерской системы вызывать ошибки и не могут достоверно знать это.

Однако, если у вас есть выделенный модуль для Active Directory (например, модуль ActiveDirectory от Microsoft или модуль Quest QAD), возможно, они перечислили исключения, которые будут отображаться их командлетами в случае исключительных условий в системе поддержки. Эту справку можно найти, скорее всего, в файлах справки модуля (или оснастки) или для каждого командлета. Попробуйте выполнить следующую команду:

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

Это покажет полный синтаксис вызова вместе с любыми заметками, которые разработчики сочли достаточно хорошими, чтобы благословить вас. Обратите особое внимание на нижний колонтитул; именно здесь вы обычно найдете более общую справочную тему, например "about_thesecmdlets", с которой вы можете просматривать: get-help about_thesecmdlets

Надеюсь, это поможет.

...