2012-11-28 9 views
6

Ho problemi a rilevare un errore in PowerShell quando una connessione non riesce a un server SQL che utilizza Invoke-Sqlcmd. Questo è un codice generico per dimostrare il problema:Powershell Try Catch invoke-sqlcmd

CLS 
$server = "Localhost\fake" 
try 
{ 
    Invoke-Sqlcmd -Query "SELECT DB_NAME() as [Database]" -Server $server 
} 
catch 
{ 
    Write-Host "Error connecting to server " $server 
} 

ottengo il seguente errore:

Invoke-Sqlcmd : A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

mi aspettavo di ottenere la dichiarazione di una riga: "Errore di connessione al server di Localhost \ falso"

+0

Sono su PowerShell v3 e il tuo codice mi dà il tuo errore personalizzato. –

+0

Anche in powershell v2 –

+0

Grazie, è bello sapere, sono apparentemente ancora su 2. –

risposta

8

Sembrerebbe che l'errore è considerato non-terminating che è un po 'strano. Prova Invoke-SqlCommand con un parametro aggiuntivo: -ErrorAction Stop. Se l'errore non è terminato, questo verrà convertito in un errore di chiusura che è possibile rilevare.

+0

Sembra che funzioni, grazie. –

-2

Prova

CLS 
$server = "Localhost/fake" 
try 
{ 
    Invoke-Sqlcmd -Query "SELECT DB_NAME() as [Database]" -Server $server 
} 
catch 
{ 
    $_ | Out-Null 
    Write-Host "Error connecting to server " $server 
} 

Questo catturerà l'errore e destinarli a null e visualizzare la scrittura-host

+0

Penso che tu abbia un extra} alla fine della penultima riga. Ho provato questo e ho ancora ottenuto l'errore. –

2

Distacco informazioni aggiuntive per integrare la risposta @KeithHill come una risposta dal momento che è troppo lungo per un commento.

Se il record di errore è stato creato dal comando Write Error, non termina e è soggetto al comportamento specificato dall'argomento -ErrorAction o dalla variabile di sistema $ ErrorActionPreference. Gli errori che utilizzano il lancio stanno terminando. Consultare la documentazione per Write-Error (si noti che PowerShell 4.0 e versioni precedenti non presentano il parametro -Exception menzionato nella pagina Web.) E about_Throw nel sistema di guida di PowerShell.

Se si desidera aggiungere le informazioni di errore personalizzato e ne fanno un errore fatale, lanciare dal blocco catch come segue:

catch 
{ 
    throw (New-Object System.Exception "Error connecting to server $($server).", $_.Exception) 
} 

È possibile utilizzare Write-Error se si vuole terminazione a comportarsi come specificato dal -ErroreAzione argomento. In PowerShell 4.0 e sotto il comando Write-Error non è consentito un argomento -Exception e pertanto non fornirà InnerException. Ciò significa che il chiamante dovrebbe esaminare la raccolta nella variabile di sistema $ Error se è necessario determinare l'eccezione originale. Nelle versioni successive è possibile utilizzare Write-Error -Message "Some additional error information." -Exception $_.Exception nel blocco catch.