2011-01-14 19 views
7

Perché viene visualizzato un messaggio di errore sulla console quando si eseguono questi due semplici campioni? Voglio che ottengo "Errore test :)" stampato sulla console invece di:PowerShell 2.0 e come gestire le eccezioni?

Get-WmiObject: Il server RPC è disponibile. (Eccezione da HRESULT: 0x800706BA) alla riga: 3 char: 15 + Get-WmiObject < < < < -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_LogicalDisk + CategoryInfo: InvalidOperation: (:) [Get-WmiObject], COMException + FullyQualifiedErrorId: GetWMICOMException, Microsoft.PowerShell.Commands.GetWmiObjectCommand

o

Tentativo di divisione per zero. Alla riga: 3 char: 13 + $ i = 1/< < < + CategoryInfo: NotSpecified: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId: RuntimeException

Primo esempio:

try 
{ 
    $i = 1/0 
    Write-Host $i  
} 
catch [Exception] 
{ 
    Write-Host "Error testing :)" 
} 

secondo esempio:

try 
{ 
    Get-WmiObject -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk 
} 
catch [Exception] 
{ 
    Write-Host "Error testing :)" 
} 

Grazie mille!

risposta

11

Primo esempio

L'errore si verifica in fase di compilazione/analisi (PowerShell è abbastanza intelligente), in modo che il codice non è nemmeno eseguito e non può prendere nulla, anzi. Prova questo codice al posto e si cattura un'eccezione:

try 
{ 
    $x = 0 
    $i = 1/$x 
    Write-Host $i 
} 
catch [Exception] 
{ 
    Write-Host "Error testing :)" 
} 

Secondo esempio

Se si imposta $ErrorActionPreference = 'Stop' a livello globale, allora si otterrà "test di errore :)" stampato, come previsto. Ma il tuo $ErrorActionPreference è presumibilmente 'Continue': in tal caso non vi è alcun errore di terminazione/eccezione e si ottiene semplicemente il messaggio di errore non terminante stampato sull'host dal motore.

Invece dell'opzione globale $ErrorActionPreference è anche possibile giocare con il parametro Get-WmiObjectErrorAction. Prova a impostarlo su Stop e vedrai un'eccezione.

try 
{ 
    Get-WmiObject -ErrorAction Stop -ComputerName possibly.nonexisting.domain.com -Credential (Get-Credential) -Class Win32_logicaldisk 
} 
catch [Exception] 
{ 
    Write-Host "Error testing :)" 
} 
+0

Quindi se $ ErrorActionPreference è impostato su "Continua" (che è l'impostazione predefinita), viene visualizzato semplicemente il messaggio di errore e lo script continua normalmente? – Primoz

+0

E se $ ErrorActionPreference è impostato su "Stop", l'esecuzione dello script verrà interrotta alla prima eccezione non gestita? – Primoz

+1

Sì, esattamente.Personalmente, trovo questa opzione di default confusa e leggermente pericolosa: può portare a continuazioni inaspettate troppo spesso. Preferirei 'Stop' di default, ed è quello che faccio prima nei miei profili PS. –

Problemi correlati