2017-11-25 34 views
5

Đây là câu hỏi thực hành tốt nhất mà tôi cho là.Xử lý lỗi PowerShell với chức năng

Khi thiết kế các hàm sẽ được sử dụng trong các tập lệnh, cách tốt nhất để xử lý các lỗi có thể xảy ra trong hàm là gì?

Ví dụ, chúng ta có một chức năng cơ bản mà không X và Y:

Function Test-Function 
{ 
    Try 
    { 
     <# Something in here that would generate an error #> 
    } 
    Catch 
    { 
     Throw 
    } 

    Return $someReturnResultIWantInMyScript 
} 

Kịch bản của tôi gọi chức năng này:

Try 
{ 
    $ValueIWantFromFunction = Test-Function 
} 
Catch 
{ 
    <# Do something here #> 
} 

Nếu Test-Function lượt truy cập một lỗi chấm dứt, nó sẽ ném cho người gọi. Các Try/Catch xung quanh cuộc gọi chức năng của tôi trong kịch bản sẽ nhận được lỗi này và nhấn bắt riêng của nó. Sau đó tôi có thể quyết định phải làm gì.

Nếu tôi không ném lỗi trong hàm, tập lệnh sẽ không thấy lỗi kết thúc và sau đó $ValueIWantFromFunction của tôi có thể chứa $Null hoặc nội dung nào đó không hữu ích.

Đây có phải là cách xử lý lỗi tốt với các chức năng và các cuộc gọi hàm trong các tập lệnh không? Có cách nào tốt hơn?

+0

Tôi sẽ nói nó phụ thuộc vào trường hợp sử dụng. Đối với hầu hết các phần, các tùy chọn này tồn tại để cung cấp cho bạn lựa chọn. Thực hành tốt nhất là tránh kích hoạt các lỗi đó nếu nó có thể tránh được với logic điều kiện khác. – Matt

+0

Lỗi chấm dứt sẽ chuyển đến người gọi bất kể thử/bắt của bạn, trừ khi thử/bắt của bạn đang chặn nó. – TheIncorrigible1

+0

Vậy làm cách nào để xử lý lỗi nếu hàm cũng trả về một giá trị (giả sử nó thành công?) – PnP

Trả lời

0

Cách tốt nhất là sử dụng ngoại lệ để xử lý lỗi trong các hàm/tập lệnh của tôi và ghi lại chúng để người gọi biết điều gì đã xảy ra. Ví dụ:

Function Remove-File 
{ 
    [CmdletBinding()] 
    [OutputType([Int])] 
    Param(
     [Parameter(Mandatory)] 
     [String]$Path 
    ) 

    Try 
    { 
     Remove-Item -Path $Path 
     Return 0 
    } 
    Catch 
    { 
     Return 1 
    } 
} 

Nếu tôi đang thiết kế chức năng của riêng tôi/lệnh, tôi sẽ tạo ra một đối tượng tùy chỉnh [ErrorRecord] được ném:

#Requires -Version 5 
If ($ErrorCondition) 
{ 
    $PSCmdlet.ThrowTerminatingError(
     [System.Management.Automation.ErrorRecord]::new(
      [System.Exception]::new('Error message'), 
      'FullyQualifiedName', 
      [System.Management.Automation.ErrorCategory]::DeviceError, 
      $ErrorCausingObject 
     ) 
    ) 
} 

Sử dụng phương pháp này, tôi có thể bao gồm trong tài liệu mà lỗi được ném tùy thuộc vào những gì đã đi sai để người gọi có thể sử dụng nhiều bắt tùy thuộc vào lỗi ném và xử lý nó.

Dưới đây là một số điều tốt đẹp:
Everything about exceptions
Scripting Guy: Handling errors
On the OutputType attribute

Các vấn đề liên quan