Правильный способ отловить конкретное исключение, если оно заключено в исключение PSInvalidCastException - PullRequest
0 голосов
/ 27 сентября 2018

Учитывая следующий недопустимый XML:

<?xml version="1.0" encoding="utf-8"?>
<root><nodeNotClosed></root>

Этот PowerShell будет захватывать исключение недопустимого приведения:

$path = 'c:\temp\invalidXml.xml'
try {
    $myXml = [xml](Get-Content -Path $path -Raw)
} catch [System.Management.Automation.PSInvalidCastException] {
    "'$path' is not a valid XML document"
}

Однако я хочу, чтобы блок catch только улавливал проблемы, связанные с приведениемсодержимое файла в XML;не другие типы исключения броска.Это можно сделать так:

$path = 'c:\temp\invalidXml.xml'
try {
    $myXml = [xml](Get-Content -Path $path -Raw)
    #some other code which may cause a PSInvalidCastException to be thrown. e.g.
    #$myDate = [DateTime]'not a date'
} catch [System.Management.Automation.PSInvalidCastException] {
    if ($_.Exception.InnerException -as [System.Xml.XmlException]) {
        "'$path' is not a valid XML document"
    } else {
        throw #not the exception we wanted to catch, so throw it back
    }
}

Однако, это кажется грязным.Есть ли способ лучше?Например, что-то вроде ниже (я пробовал это, но это не работает; поскольку здесь мы пытаемся поймать внутреннее исключение, а не реальное исключение).

$path = 'c:\temp\invalidXml.xml'
try {
    $myXml = [xml](Get-Content -Path $path -Raw)
} catch [System.Xml.XmlException] {
    "'$path' is not a valid XML document"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...