2012-11-28 13 views
6

Mam problemy z wykrywaniem błędu w PowerShell, gdy połączenie nie powiedzie się do SQL Server za pomocą Invoke-Sqlcmd. To jest jakiś rodzajowy kod do wykazania problem:Powershell Spróbuj 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 
} 

pojawia się następujący błąd:

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)

Spodziewałem się uzyskać oświadczenie jednym wierszu: „Błąd podczas łączenia z serwerem localhost \ fake”

+0

Jestem na Power Shell v3, a Twój kod daje mi niestandardowy błąd. –

+0

Również w Power Shell v2 –

+0

Dzięki, to dobrze wiedzieć, najwyraźniej wciąż jestem na 2. –

Odpowiedz

8

Wygląda na to, że błąd uznaje się za nie kończący się, co jest nieco dziwne. Wypróbuj Invoke-SqlCommand z dodatkowym parametrem: -ErrorAction Stop. Jeśli błąd nie zakończy się, spowoduje to przekształcenie go w błąd kończący, który można przechwycić.

+0

Wygląda na to, że dziękuje. –

-2

Spróbuj

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 
} 

To uchwycić błąd i przekierować go na null i wyświetlać write-host

+0

Myślę, że masz dodatkowe} pod koniec drugiej do ostatniej linii. Próbowałem tego i nadal mam błąd. –

2

publikowania dodatkowych informacji w celu uzupełnienia odpowiedź przez @KeithHill jako odpowiedź, ponieważ jest zbyt długi za komentarz.

Jeśli zapis błędu został utworzony przez polecenie Write-Error, nie jest zakończony i podlega zachowaniu określonemu przez argument -ErrorAction lub zmienną systemową $ ErrorActionPreference. Błędy kończące się rzutem kończą się. Zobacz dokumentację dla Write-Error (Należy zauważyć, że PowerShell w wersji 4.0 i poniżej nie ma parametru wyjątku wymienionego na stronie internetowej) i about_Throw w systemie pomocy PowerShell.

Jeśli chcesz dodać informację niestandardowych błędów i sprawiają, że błąd obciążeniowy, wyrzucić ze swojego bloku catch następująco:

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

Można użyć Write-Error jeśli chcesz zakończenie zachowywać się w sposób określony przez Argument -Rekcja błędów. W programie PowerShell 4.0 i poniżej polecenie Zapisz błąd nie pozwala na użycie argumentu wyjątku, dlatego nie zapewnia wyjątku InnerException. Oznacza to, że wywołujący musiałby zbadać kolekcję w zmiennej systemowej $ Error, jeśli musi określić oryginalny wyjątek. W późniejszych wersjach możesz użyć Write-Error -Message "Some additional error information." -Exception $_.Exception w swoim bloku catch.