【问题标题】:Can't catch HttpRequestException无法捕获 HttpRequestException
【发布时间】:2018-07-04 17:24:22
【问题描述】:

我有以下代码

public async Task<T> SendData<T>()
{
    T result = default(T);

    using (var client = new HttpClient())
    {
        using (var formData = new MultipartFormDataContent())
        {
            try
            {
                foreach (var p in ParametresToSend)
                    formData.Add(p.Value, p.Key);

                HttpResponseMessage response = await client.PostAsync(URL, formData);

                string stringContent = await response.Content.ReadAsStringAsync();
                result = JsonConvert.DeserializeObject<T>(stringContent);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                ParametresToSend.Clear();
            }
        }
    }

    return result;
}

它工作得很好,但是如果在检查它的可用性后互联网不可用(很短的时间,但有可能),它会捕获 first HttpRequestException。在此之后,立即将抛出 second HttpRequestException,但 catch 块没有捕获它并且应用程序崩溃。为什么会幸福?

【问题讨论】:

  • 好吧,在您的 catch 中,您正在重新抛出异常(即使那是您想要的,但您不应该使用普通的 throw;
  • ... 或者删除 catch 块,因为它在这里没有任何作用(除了 - DavidG 的观点 - 破坏当前写入的堆栈跟踪)
  • @DavidG,你说得对,但我已经尝试了一切,在所有情况下我仍然有第二个例外。
  • 是的,您有第二个异常,因为您再次抛出异常!你觉得throw 是做什么的?
  • @Riko3412 您是否在 VS 的输出窗口中观察到这些?因为这可能会给您一种印象,即它正在重新触发并且没有被处理(如果您说它在没有捕获的情况下表现相同)。我已经尝试过您的代码,但无法重现。

标签: c# exception try-catch httpclient


【解决方案1】:

当你捕获它时,你正在重新抛出异常,这与一开始就没有捕获它一样好。

您的应用程序正在崩溃,因为没有任何地方可以处理这个重新抛出的异常 - 您没有任何全局异常处理地方,如果这本身就是一个 ASP.NET 应用程序,这将是一个非常好的主意.

【讨论】:

    【解决方案2】:
          try
            {
                HttpResponseMessage response = await client.PostAsync(URL, formData);
                if (response.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    string stringContent = await response.Content.ReadAsStringAsync();
                    result = JsonConvert.DeserializeObject<T>(stringContent);
                }
            }
            catch (HttpRequestException)
            {
    
                throw;
            }
    

    试试这个

    【讨论】:

    • 发帖者想捕捉异常,但无法弄清楚两个异常是如何被抛出的。
    • 但这仍然会重新抛出错误,这就是问题所在!
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2012-11-09
    • 2011-03-14
    • 2012-03-15
    相关资源
    最近更新 更多