Я хотел бы добавить пользовательский System.Management.Automation.ErrorRecord
с некоторыми дополнительными свойствами: ContextMessage
и SqlCmdHeader
.
Я пытался создать новый класс, унаследованный от System.Management.Automation.ErrorRecord
:
class SqlRequestException : System.Management.Automation.ErrorRecord
{
[hashtable]$SqlCmdHeader
[string]$ContextMessage
SqlRequestException() { }
SqlRequestException(
[string]$message,
[hashtable]$sqlCmdHeader,
[System.Management.Automation.ErrorRecord]$errorRecord
) : base($errorRecord, $null)
{
$this.SqlCmdHeader = $sqlCmdHeader
$this.ContextMessage = $message
}
}
Но когда я выкидываю ошибку по этому коду:
try
{
#exceptions is risen here
}
catch
{
throw ([SqlRequestException]::New(
"Some context message of exception which will help to understand the error without additional debugging of code",
$sqlHeader,
$_))
}
Я попал в вызывающую программу просто System.Management.Automation.ErrorRecord
без моих удивительных свойств. Похоже, throw
привел мой объект к System.Management.Automation.ErrorRecord
и потерял свойства.
Я хотел бы попросить вас, ребята, помочь мне реализовать эту логику c в моем сценарии. Любая помощь будет очень полезна!
Обновление
Я не могу изменить код звонящего. Он всегда анализирует ошибку и записывает ее в журналы:
try
{
# calling the method from module where I try to throw custom ErrorRecord
}
catch
{
Write-Log -Text $_
}
Я не могу использовать System.Exception
, потому что когда я генерирую созданное исключение, вся оригинальная информация (например, InvocationInfo
, ScriptStackTrace
и др. c) ) из ErrorRecord
потеряно. Я не смог найти исходный код оператора throw
, чтобы понять, как именно он работает (может, кто-то может указать мне на это?)
Я вижу, что есть свойство TargetObject
, которое можно использовать для хранения некоторых дополнительных информацию, но я не вижу способов поместить что-то в свойство перед оператором throw
, так как свойство равно ReadOnly
, и я думаю, что свойство не предназначено для хранения дополнительных данных пользователя.