powershell 如何在Invoke-WebRequest中处理错误?

jaql4c8m  于 2022-12-18  发布在  Shell
关注(0)|答案(1)|浏览(225)

2022年12月1日:拉波什奥格莱米纳拉图奥格莱米纳拉图奥格莱米纳拉图奥格莱米纳拉图奥格莱米纳7.3。
文档建议使用“Try-Catch”,问题如下。
0.更新:https://github.com/PowerShell/PowerShell/issues/16145
1."Catch [System.Net.WebException]“选项对我来说从来都不起作用,”Catch [System.Management.Automation.RuntimeException]“一直都是激活的。例如,当被零除时,它就被激活了。可以将它们分成不同的组吗?
1.对于不同的错误,在"Catch“-块中自动变量”$“的方法和属性集是不同的,访问方法BEFORE ERROR UNDSTANDING可能会导致新的错误,到目前为止,我只看到一个常量参数:$.Exception.HResult
1.在下载过程中断开连接时(例如,路由器重新启动)根本不发生错误,执行"Try“-块中的下一条语句,并且”$Error.Count"不增加,磁盘上的文件保持PARTIALLY下载状态(尽管对于某些类型的内容它可能不存在,第三方实用程序“cURL”在连接断开时返回错误,非零代码为18和28(也许吧,还有其他的,我记不太清了)。在PowerShell中这是可能的吗?
Notabene:重新启动路由器或断开电缆,你必须用你的手,而不是我的代码样本.
1.移除。
1.用我知道的语言(不是英语)编写的程序的一部分。

$Error.Count  
Try {  
      # Для самых НЕвнимательных ПОВТОРЯЮ И ПОДЧЁРКИВАЮ, что  
      #     меня интересуют ошибки «Invoke-WebRequest»,  
      #     а НЕ ДЕЛЕНИЯ.  Как их отделить друг от друга?  
      #     Именно об этом я написал в исходном вопросе!  
      <# 1/0 # Для проверки этого случая раскомментируйте вручную. #>  
      Invoke-WebRequest -URI СсылкаНаБольшойФайл -ErrorAction Stop  
      $Error.Count  
} Catch [System.Net.WebException] { # In THIS order!  
      "Эта секция не выполняется НИКОГДА."  
} Catch [System.Management.Automation.RuntimeException] {  
      "Эта секция выполняется ВСЕГДА при ошибках 1/0 and «IWR»."  
      "Управление попадает сюда при ЛЮБЫХ ошибках из моего примера,"  
      "     КАК арифметических, ТАК и сетевых.  Всё в одну кучу."  
      # Для самых НЕвнимательных ПОВТОРЯЮ И ПОДЧЁРКИВАЮ, что  
      #     меня интересуют ошибки «Invoke-WebRequest»,  
      #     а НЕ ДЕЛЕНИЯ.  Как их отделить друг от друга?  
      #     Именно об этом я написал в исходном вопросе!  
      # Следующая строка может вызвать ошибку,  
      #     потому что такого метода/свойства просто нет.  
      #     А может выполниться БЕЗ прерывания.  Как повезёт.  
      $_.Exception.InnerException.ErrorCode  
      "В документации НИ слова о том,"
      "    какие элементы (методы/свойства) присутствуют ВСЕГДА."  
} Catch [System.SystemException] { # In THIS order!  
      "Эта секция не выполняется НИКОГДА."  
} Catch { # In THIS order!  
      "Эта секция не выполняется НИКОГДА."  
}
hm2xizp9

hm2xizp91#

我运行了您的代码,并观察到以下情况:

  • PowerShell 5.1在失败时发出WebException。
  • PowerShell 7会发出System.Net.Http.HttpRequestException,如果您发现它会将Web异常与您假设的除以零的结果分开。

如果HttpRequestException的内部异常是SocketException,则可以使用ErrorCode字段获取底层Windows套接字错误:

try{
  $res = Invoke-WebRequest -URI 'https://notexist.example.com/' -ErrorAction Stop
}catch[System.Net.Http.HttpRequestException]{
  $_.exception.innerexception.errorcode
}

11001

可能的代码列表如下所示:https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2
然而,此时您必须问自己,对于DNS故障、连接故障、连接被拒绝以及列表中的所有其他可能选项,您真的要在代码中采取不同的操作吗?
至于你的最后一点,当我拔掉网络电缆PowerShell 7只是挂起无限期,这可能是这个开放的错误:https://github.com/PowerShell/PowerShell/issues/12249

相关问题