Детализация информации об ошибке в функциях и модулях powershell
Уже неоднократно описывал возможные обёртки для сценариев, регистрирующие более или менее подробную информацию об ошибке в журнале событий для последующего анализа.
Однако, зачастую в пределах функции у Вас может возникнуть необходимость детализации сообщения об ошибке (скажем – включить какие-либо выражения в лог). Одна из подобных проблем описана здесь. Решим задачу!
Приведу пример сценария, отлично демонстрирующего необходимый нам функционал:
trap { # здесь - "внешний" обработчик обёртки. Здесь мы можем писать в журнал событий, в лог, # посылать письма или ещё чего. При этом код нам не придётся дублировать, # всю "специфическую" дополнительную информацию получаем из $_.Exception.Data["extraInfo"] @" При выполнении сценария $($global:myinvocation.mycommand.name) $((Get-Date).ToShortDateString()) в $((Get-Date).ToShortTimeString()) возникла ошибка: $($_.InvocationInfo.PositionMessage) $($_.Exception) $($_.Exception.Data["extraInfo"]) "@ } function tf { param ( $test ) trap { $_.Exception.Data["extraInfo"] = "`nПараметр $test"; break; } 1/$null "после ошибки" } tf ("kkk")Как хорошо видно, мы не переписываем обработку исключения в теле функции tf, мы лишь добавляем необходимую для последующего анализа информацию в объект исключения.
Было бы удобно на первый взгляд поправить свойство .Message объекта исключения, но это свойство read-only. Поэтому используем .Data.
При таком решении, как видно, мы имеем универсальный обработчик верхнего уровня, осуществляющий вывод в журнал, в лог, и так далее, а задачи формирования для него необходимой дополнительной информации выполняются локальными обработчиками.
P.S. Именно таким образом для решения нашей проблемы я включил текст sql запроса в выводимое сообщение. В результате получили следующее сообщение в журнале событий:
Event Type: Error Event Source: itgCheckMailFlow Event Category: None Event ID: 0 Date: 23.11.2010 Time: 16:04:19 User: N/A Description: При выполнении сценария itgCheckMailFlow.ps1 23.11.2010 в 16:04 возникла ошибка: At C:\temp\itgLogParser.psm1:98 char:34 + $LPRecordSet = $LPQuery.Execute <<<< ($query) System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException (0x80010105): The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT)) --- End of inner exception stack trace --- at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at System.Management.Automation.ComMethod.InvokeMethod(PSMethod method, Object[] arguments) logParser query: SELECT c-ip AS UserIP, cs-username AS Host, cs-method AS RequestType, cs-uri-query AS RequestParams FROM D:\Logs\SMTPSVC1\ex101122.log WHERE ( (RequestType = 'MAIL') AND ( (RequestParams LIKE '%XXXXX@1ak-m.ru%') OR (RequestParams LIKE '%XXXX@3185504.ru%') OR (RequestParams LIKE '%@gazprom-neft.kg%') OR (RequestParams LIKE '%@globalinvestmentbridge.com%') OR ) )
RSS комментарии
Обратная ссылка