2012-11-28 3 views
6

Ich habe Probleme beim Erfassen eines Fehlers in PowerShell, wenn eine Verbindung zu einem SQL Server mit Invoke-Sqlcmd fehlschlägt. Dies ist einige allgemeine Code, um das Problem zu demonstrieren: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 
} 

ich die folgende Fehlermeldung erhalten:

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)

Ich hatte erwartet, die eine Zeile Erklärung zu bekommen: „Fehler auf Server Localhost \ gefälschte Verbindungs“

+0

Ich bin auf Powershell v3 und Ihr Code geben Sie mir Ihren benutzerdefinierten Fehler. –

+0

Auch in Powershell v2 –

+0

Danke, das ist gut zu wissen, ich bin anscheinend immer noch auf 2. –

Antwort

8

Es scheint, dass Fehler als nicht terminierend betrachtet wird, was ein bisschen seltsam ist. Versuchen Sie den Invoke-SqlCommand mit einem zusätzlichen Parameter: -ErrorAction Stop. Wenn der Fehler nicht beendet wird, wird dies in einen Abbruchfehler umgewandelt, den Sie abfangen können. Versuchen

+0

Sieht so aus, funktioniert, danke. –

-2

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 
} 

Dies wird den Fehler erfassen und leiten sie Ihre Schreib Host auf Null und zeigt

+0

Ich denke, du hast ein Extra} am Ende der vorletzten Zeile. Ich habe das versucht und ich habe immer noch den Fehler. –

2

Posting zusätzliche Informationen, die Antwort von @KeithHill als Antwort zu ergänzen, da es zu lang ist für einen Kommentar.

Wenn der Fehlerdatensatz vom Write-Error-Kommando erstellt wurde, ist er nicht terminierend und unterliegt dem Verhalten, das durch das Argument -ErrorAction oder die Systemvariable $ ErrorActionPreference angegeben wird. Fehler mit throw enden. Weitere Informationen finden Sie in der Dokumentation für Write-Error (Beachten Sie, dass PowerShell 4.0 und niedriger nicht den auf der Webseite erwähnten Parameter -Exception aufweisen) und about_Throw im PowerShell-Hilfesystem.

Wenn Sie benutzerdefinierte Fehlerinformationen hinzufügen möchten, und es einen Abschluss Fehler machen, von Ihrem catch-Block werfen, wie folgt:

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

können Sie Write-Error verwenden, wenn Sie Beendigung wollen, wie durch das angegebene verhalten -ErrorAction Argument. In PowerShell 4.0 und höher lässt das Write-Error-Commandlet kein -Exception-Argument zu und bietet daher keine InnerException. Das bedeutet, dass der Aufrufer die Auflistung in der $ Error-Systemvariablen untersuchen müsste, wenn er die ursprüngliche Ausnahme ermitteln muss. In späteren Versionen können Sie Write-Error -Message "Some additional error information." -Exception $_.Exception in Ihrem catch-Block verwenden.