Статья размещена автором Бетке Сергей Сергеевич

Детализация информации об ошибке в функциях и модулях 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 
            )
        )

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка