2013-11-01 39 views
0

我正在使用节俭HttpClient(C#)向我设置的Web服务器发出Web请求,如果该服务器返回200以外的内容(或202我想象),我的请求会抛出TTransport异常。如何从TTransport异常中获取HTTP状态码?

我想根据返回的特定状态码来回应这个异常,但是我没有看到任何在异常界面中公开状态码的东西。我错过了什么吗?我知道异常消息包含状态码,但我宁愿不必解析该消息以获取状态码。

+0

这是一个有趣的问题。典型的用例是抽象出底层传输的细节,以便使它(或更好:保持它)可以互换。这就是为什么所有肮脏的细节都是通过更抽象的TTransportException概念返回的。请问你问题背后的目的是什么,你想要达到什么目的? – JensG

+0

如果我收到404错误,我希望我的应用程序报告服务器关闭的用户,并且在服务器备份之前,应用程序的所有功能都不会起作用。如果是500错误,我想报告服务器在处理刚发布的特定命令时遇到问题。 我不需要在我向用户显示的消息中详细说明,并且错误日志包含状态码,因为我在那里输出异常消息,所以我可以忍受这种状态。我刚刚认为HTTPClient可能具有特定于其执行TTransport的属性 – BobbyA

+0

您是否尝试过检查'TransportException'的'Type'字段?如果是404,则设置为'EndOfFile'。如果发生其他错误,我会得到不同的错误,例如'未知'或甚至'TProtocolException',这取决于我使用的协议。最后的手段是检查一些关键字的消息文本,但这有点难看。以上任何解决方案是否会解决问题? – JensG

回答

0

如果服务器遇到处理错误,推荐的方法不是抛出一个HTTP 500.相反,服务器应该通过例外的方式发送这个信号。考虑以下节俭IDL:

exception MyProcessingError 
{ 
    1: string reason 
    2: string errorDetails 
    3: string recommendedAction 
} 

service FooBar { 
    void ProcessPayments(1: double amount; 2: string receiver) 
    throws (1: MyProcessingError mpe) 
} 

与args和struct字段类似,可以声明多个异常类型。客户端可以捕获这些异常和往常一样:

try 
{ 
    client.ProcessPayments(47.11, "Dagobert"); 
} 
catch (MyProcessingError e) 
{ 
    // process exception 
} 

备注

  • 服务器可能只抛出声明在IDL的 的特定呼叫例外。
  • 此外,oneway调用永远不会返回任何值,因此也不会有例外 异常。