实际上是否有处理错误的最佳方法?

时间:2019-04-06 19:10:17

标签: powershell

我正在尝试使用Azure上的Powershell脚本来提供新的流分析作业,以下代码段是脚本文件的一部分,该脚本文件会将服务添加到资源组。

示例代码:

try{
    New-AzureRmStreamAnalyticsJob -ResourceGroupName $resourceGroup -File $template -Name $streamAnalyticsJobName -Force -ErrorAction Stop 
}catch{
    Write-Output $error[0] | Out-File -Append -FilePath $errLogFilePath

}

New-AzureRmStreamAnalyticsJob -ResourceGroupName $resourceGroup -File $template -Name $streamAnalyticsJobName -Force -ErrorVariable Errorvalue -ErrorAction SilentlyContinue
Write-Output Errorvalue | Out-File -Append -FilePath $errLogFilePath

建议/最好的方式在日志文件中记录错误以供查看。

1 个答案:

答案 0 :(得分:2)

  • 由于使用了New-AzureRmStreamAnalyticsJob / try,您的第一条命令还将处理catch发出的任何 terminate 错误。

    • 一般来说,如果命令有多个输入并在每个输入的基础上发出了 non-terminate 错误-这意味着即使在执行以下操作后,默认情况下处理也会继续 特定的输入会导致非终止错误-您使用-ErrorAction Stop实际上会短路,并在遇到 first 非终止错误时中止。 / li>
  • 在您的第二条命令中,如果发生 terminate 错误,则您对-ErrorAction SilentlyContinue的使用将无效,并且对您来说都不是有效的尝试通过-ErrorVariable捕获该错误-简而言之:公用参数-ErrorAction仅影响非终止错误。

相比之下,$ErrorActionPreference 首选项变量-令人惊讶地 [1] -确实也会影响终止< / em>错误会被处理,因此,如果您的意图是,可以将以下内容作为一般模式:

  • 进行继续处理,无论是否发生错误以及错误是非终止还是终止。
  • 让错误静默地发生,并且仅将错误记录到文件中
  # Silently ignore any subsequent errors, irrespective of severity, but
  # still record them in the automatic $Error collection.
  $ErrorActionPreference = 'SilentlyContinue'

  # Save the current count of errors stored in $Error.
  $errCountBefore = $Error.Count

  New-AzureRmStreamAnalyticsJob -ResourceGroupName $resourceGroup -File $template -Name $streamAnalyticsJobName -Force

  # If errors occurred, append them to a log.
  if ($Error.Count -gt $errCountBefore) {
     $Error[$errCountBefore..($Error.Count-1)] >> $errLogFilePath
  } 

[1]有关PowerShell错误处理及其陷阱的全面概述,请参见this GitHub issue