实际上有一种处理错误的最佳方法吗?

问题描述 投票:1回答:1

我正在尝试使用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

建议/最佳方式记录日志文件中的错误以供审阅。

powershell
1个回答
2
投票
  • 由于使用了New-AzureRmStreamAnalyticsJob / try,你的第一个命令也将处理由catch发出的任何终止错误。 一般来说,如果命令有多个输入并在每个输入的基础上发出非终止错误 - 这意味着默认情况下继续处理,即使特定输入导致非终止错误 - 您使用-ErrorAction Stop实际上会短-circuit和遇到第一个非终止错误时中止。
  • 在你的第二个命令中,如果发生了终止错误,你使用-ErrorAction SilentlyContinue就不会有效,也不会尝试通过-ErrorVariable捕获该错误 - 简而言之:通用参数-ErrorAction只会影响非终止错误。

相比之下,$ErrorActionPreference偏好变量 - 令人惊讶[1] - 也会影响终止错误的处理方式,因此,作为一般模式,如果您的意图是:

  • 继续处理,不管是否发生错误以及它们是否是非终止或终止。
  • 让错误以静默方式发生,并仅将它们记录到文件中。
  # 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

© www.soinside.com 2019 - 2024. All rights reserved.