Учитывая следующий недопустимый 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"
}