2012-11-28 22 views
6

Tôi gặp sự cố khi gặp lỗi trong PowerShell khi kết nối không thành công với Máy chủ SQL sử dụng Invoke-Sqlcmd. Đây là một số mã tổng quát để chứng minh vấn đề: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 
} 

tôi nhận được lỗi sau:

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)

Tôi đã chờ đợi để có được báo cáo kết quả một dòng: "Lỗi kết nối với máy chủ Localhost \ giả"

+0

Tôi đang trên powerhell v3 và mã của bạn cung cấp cho tôi lỗi tùy chỉnh của bạn. –

+0

Cũng trong powershell v2 –

+0

Cảm ơn, thats tốt để biết, tôi dường như vẫn còn trên 2. –

Trả lời

8

Có vẻ như lỗi đó được coi là không kết thúc, hơi lạ. Hãy thử Invoke-SqlCommand với tham số bổ sung: -ErrorAction Stop. Nếu có lỗi không chấm dứt, điều này sẽ chuyển đổi nó thành lỗi kết thúc mà bạn có thể nắm bắt.

+0

Hình như hoạt động, cảm ơn. –

-2

Hãy thử

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 
} 

này sẽ nắm bắt được lỗi và chuyển hướng nó để null và hiển thị của bạn ghi-host

+0

Tôi nghĩ bạn có thêm} vào cuối dòng thứ hai đến dòng cuối cùng. Tôi đã thử điều này và tôi vẫn gặp lỗi. –

2

Đăng thông tin thêm để bổ sung câu trả lời bằng cách @KeithHill như một câu trả lời vì nó quá dài cho một bình luận.

Nếu bản ghi lỗi đã được tạo ra bởi lệnh Write-Error, nó không kết thúc và tùy thuộc vào hành vi được chỉ định bởi đối số -ErrorAction hoặc biến hệ thống $ ErrorActionPreference. Lỗi khi sử dụng lệnh throw đang chấm dứt. Xem tài liệu cho Write-Error (Lưu ý rằng PowerShell 4.0 trở xuống không có tham số -Exception được đề cập trong trang web.) Và about_Throw trong hệ thống trợ giúp PowerShell.

Nếu bạn muốn thêm thông tin lỗi tùy chỉnh và làm cho nó một lỗi chấm dứt, ném từ khối catch của bạn như sau:

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

Bạn có thể sử dụng Write-Lỗi nếu bạn muốn chấm dứt để hành xử theo quy định của Đối số -ErrorAction. Trong PowerShell 4.0 và bên dưới lệnh Write-Error không cho phép một đối số -Exception và do đó sẽ không cung cấp một InnerException. Điều đó có nghĩa là người gọi sẽ phải kiểm tra bộ sưu tập trong biến hệ thống Lỗi $ nếu nó cần xác định ngoại lệ ban đầu. Trong các phiên bản sau này, bạn có thể Sử dụng Write-Error -Message "Some additional error information." -Exception $_.Exception trong khối catch của mình.