如何处理Web API控制器抛出的异常?

时间:2017-06-20 17:40:01

标签: c# visual-studio asp.net-web-api exception-handling httprequest

我正在使用Enterprise Tester API导入和更新Web应用程序上的内容。该程序将在几个小时内正常工作,但有时它会遇到这个未处理的异常:

  

EnterpriseTester.API.Client.dll中出现未处理的“System.Net.Http.HttpRequestException”类型异常

     

其他信息:System.Net.Http.HttpRequestException状态代码未指示成功:500(内部服务器错误)

此时,Visual Studio会在发生此异常的行中断。但是,当我单击“继续”时,程序将再次正确执行。

从在互联网上搜索,似乎我应该使用try catch块来处理异常。我还想等一下再次执行同一行来访问API。

    try
    {
        client.UpdateScriptRun(Id,Run);
    }
    catch (HttpRequestException e)
    {
        Console.Writeline("HttpRequestException: {0}", e.Message);
        Thread.Sleep(1000);
        client.UpdateScriptRun(Id,Run);
     }

我不确定这样的事情是否可以解决这个问题,或者我是否需要研究一个完全不同的解决方案。

如果您能引导我找到适合此问题的解决方案,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

通常最好跟踪异常的根本原因,看看是否有办法解决它。如果由于网络出现间歇性问题而发生连接错误,这是一回事,但500错误表明服务器上出现了问题。如果您有任何方法可以追踪并修复服务器端错误,那么这是最好的方法。

如果您无法控制服务器,并且只是尝试让自己的应用程序尽可能地工作,因为知道服务器偶尔会无故失败,那么try / catch解决方案将有所帮助。不过,我会提出一些额外的建议:

  1. 使用更强大的日志记录机制,因此您可以从日志文件中了解出现问题的频率,并可能使用该信息来跟踪问题。如果信息证明有用,请在日志消息中包含参数。
  2. 创建一个帮助您重试的辅助方法,以便您可以在其他地方重用该模式。
  3. 在这个辅助方法中,从几乎立即重试开始,然后等待指数增加的时间段(10毫秒,100毫秒,1000毫秒),直到您看到成功或达到合理的最大限制。
  4. 无论消耗什么代码都应该有自己的try / catch,以确保用户在事情不能正常工作时获得体面的体验。