2017-11-25 88 views
5

Bu, benim için en iyi uygulama sorusu.PowerShell İşlevlerle Çalışmada Hata Giderme

Komut dosyalarında kullanılacak işlevleri tasarlarken, işlevin içinde oluşabilecek hataları işlemenin en iyi yolu nedir? Bu atacağım

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

Test-Function bir sonlandırma hatası vurursa:

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

    Return $someReturnResultIWantInMyScript 
} 

Benim komut dosyası bu işlevini çağırır: Örneğin

, biz X ve Y yok temel işlevi olduğunu varsayalım arayan kişiye. Komut dosyasındaki işlev çağrımın etrafındaki Try/Catch bu hatayı alacak ve kendi catch'una sahip olacaktır. Sonra ne yapacağına karar verebilirim.

İşlev içinde bir hata atmamış olsaydım, komut dosyası sonlandırıcı hatayı görmez ve $ValueIWantFromFunction benim $Null veya yararlı olmayan bir şey içerebilir.

Bu, komut dosyalarındaki işlevler ve işlev çağrıları ile çalışırken iyi bir hata mıdır? Daha iyi bir yolu var mı?

+0

Ben kullanım durumuna bağlıdır söyleyeceğim. Çoğunlukla bu seçenekler size seçenek sunmak için var. En iyi uygulama, diğer koşullu mantıkla önlenebilirse bu hataları tetiklemekten kaçınmak olacaktır. – Matt

+0

Deneme hataları, try/catch'unuz engellenmediği sürece, try/catch'unuz ne olursa olsun arayanına gider. – TheIncorrigible1

+0

İşlev de bir değer döndürüyorsa (nasıl başarılı olur?), Hatayı nasıl ele alırım? – PnP

cevap

0

En iyi uygulama olarak, işlevleri/komutlarımdaki hataları işlemek için istisnaları kullanmaktan ve arayanın neyin yanlış gittiğini bilmesi için bunları belgelemekten hoşlanırım. Örneğin: Kendi fonksiyon/cmdlet'ini tasarlıyorum Eğer

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

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

, ben özel bir [ErrorRecord] nesneyi elde edersiniz atılmasına:

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

Bu yöntemi kullanarak, ben belgelerinde içerebilir neyin yanlış gittiğine bağlı olarak hangi hatalar atılır, böylece arayan hataya bağlı olarak birden fazla yakalamayı kullanabilir ve kullanabilir.

İşte bazı güzel haberler şunlardır:
Everything about exceptions
Scripting Guy: Handling errors
On the OutputType attribute