异常处理
HttpClient的使用者在执行HTPP方法(GET,PUT,DELETE等),可能遇到会两种主要类型的异常:
- 传输异常
- 协议异常
并不是所有的异常都会传播给HttpClient的用户。HttpClient内部使用的异常在下文中将会标记为内部使用
- 传输异常
- 协议异常
- HTTP传输安全
- 自动异常恢复
- 自定义异常处理
传输异常
传输异常都是诸如不可靠的连接到输入/输出失败或者未能在给与的时间内执行完HTPP方法(套接字超时)。一般来说,传输异常是非致命的错误,通过多次执行方法能够恢复。在非幕等方法中恢复特别需要注意(详细信息请参考HTTP传输安全)。
java.io.IOException
HttpCinet一般的传输异常可以用标准JAVA中 java.io.IOException或者其子类java.net.SocketException,java.net.InterruptedIOException来表示。
为了规划化输入/输出异常类,HttpClient定义多种自定义传输异常用来传递HttpClient特定的信息。
org.apache.commons.httpclient.NoHttpResponseException java.io.IOException +- org.apache.commons.httpclient.NoHttpResponseException
在某些情况下,由于服务器负载过大,服务器能接受到请求,但是没有能力去处理,像工作线程这样限制性资源就是一个很少的例子。这可能会导致服务器丢弃与客户端的连接,而不会给予任何回应。HttpClient遭遇这种情况时,抛出NoHttpResponseException 。在多数情况下,通过重试能够从此异常中恢复。
org.apache.commons.httpclient.ConnectTimeoutException java.io.IOException +- java.io.InterruptedIOException
这种异常表示在给定的时间HttpClient与目标服务器或代理服务器建立起连接。
org.apache.commons.httpclient.ConnectionPoolTimeoutException
- java.io.IOException
- +- java.io.InterruptedIOException
- +- org.apache.commons.httpclient.ConnectTimeoutException
- +- org.apache.commons.httpclient.ConnectionPoolTimeoutException
只有在使用多线程连接管理器时,才可能发生此异常。此异常表示在给定的时间从连接池中获取一个空闲连接失败。
org.apache.commons.httpclient.HttpRecoverableException
- java.io.IOException
- +- org.apache.commons.httpclient.HttpException
- +- org.apache.commons.httpclient.HttpRecoverableException
废弃,任何标准HttpClient类中不会抛出此异常。
协议异常
在HTTP规范的解释中,协议异常通常是由客户端与服务器(web服务器或是代理服务器)的不匹配导致的逻辑错误。如果不对客户端的请求或服务器做出调整,HttpClient此异常不能恢复。HTTP规范的多个方面允许不同甚至是相互冲突的解释。HttpClient能偶采用配置来支持从非常宽松到非常严格的HTTP规范的遵从度。
org.apache.commons.httpclient.HttpException
- java.io.IOException
- +- org.apache.commons.httpclient.HttpException
HttpException在HttpClient中代表一个抽象逻辑错误,一般情况下,程序不能从这种错误中恢复。
org.apache.commons.httpclient.ProtocolException
- java.io.IOException
- +- org.apache.commons.httpclient.HttpException
- +- org.apache.commons.httpclient.ProtocolException
ProtocolException表示一个HTTP规范的冲突,值得注意的是HTTP代理服务器和HTTP服务器有着不同的HTTP规范的支持度级别。通过配置HttpClient更宽松可以让程序从非致命的协议冲突的HTTP协议异常恢复。
org.apache.commons.httpclient.auth.MalformedChallengeException
- java.io.IOException
- +- org.apache.commons.httpclient.HttpException
- +- org.apache.commons.httpclient.ProtocolException
- +- org.apache.commons.httpclient.auth.MalformedChallengeException
内部使用
MalformedChallengeException表示一个身份认证凭证的某些方面在给定的身份认证的上下文中是无效或者非法的。
org.apache.commons.httpclient.auth.AuthenticationException
- java.io.IOException
- +- org.apache.commons.httpclient.HttpException
- +- org.apache.commons.httpclient.ProtocolException
- +- org.apache.commons.httpclient.auth.AuthenticationException
内部使用
AuthenticationException用来表示身份认证过程中的失败。通常,认证异常不会传递给调用者,只在内部处理使用。
org.apache.commons.httpclient.auth.AuthChallengeException
- java.io.IOException
- +- org.apache.commons.httpclient.HttpException
- +- org.apache.commons.httpclient.ProtocolException
- +- org.apache.commons.httpclient.auth.AuthenticationException
- +- org.apache.commons.httpclient.auth.AuthChallengeException
内部使用
HttpClient无法响应服务器发送的任何身份验证质询时,AuthenticationException将会抛出。
org.apache.commons.httpclient.auth.CredentialsNotAvailableException
- java.io.IOException
- +- org.apache.commons.httpclient.HttpException
- +- org.apache.commons.httpclient.ProtocolException
- +- org.apache.commons.httpclient.auth.AuthenticationException
- +- org.apache.commons.httpclient.auth.CredentialsNotAvailableException
内部使用
CredentialsNotAvailableException表明响应身份验证质询的要求的证书不可用。
org.apache.commons.httpclient.auth.InvalidCredentialsException
- java.io.IOException
- +- org.apache.commons.httpclient.HttpException
- +- org.apache.commons.httpclient.ProtocolException
- +- org.apache.commons.httpclient.auth.AuthenticationException
- +- org.apache.commons.httpclient.auth.InvalidCredentialsException
内部使用
InvalidCredentialsException 表明响应身份验证质询的要求的证书被服务器拒绝。
org.apache.commons.httpclient.cookie.MalformedCookieException
java.io.IOException
+- org.apache.commons.httpclient.HttpException
+- org.apache.commons.httpclient.ProtocolException
+- org.apache.commons.httpclient.cookie.MalformedCookieException
内部使用
MalformedCookieException表示cookie的某些方面在给定的HTTP会话上下文中是无效或者非法的。有多种不兼容cookie规范,因此,cookie合法性建立在用于分析的特定cookie规范的上下文中和验证服务器发送cookie头消息。如果应用程序需要处理不常见的cookie规范定义的cookie,请查看cookie文档获取更多的信息。
org.apache.commons.httpclient.RedirectException
- java.io.IOException
- +- org.apache.commons.httpclient.HttpException
- +- org.apache.commons.httpclient.ProtocolException
- +- org.apache.commons.httpclient.RedirectException
RedirectException表示一个无效的重定向响应导致了HTTP规范冲突。如果使用HttpClient的应用程序就重定向需要更多的宽松度的话,它可以选择禁用自动重定向处理和实现自定义重定向策略。
org.apache.commons.httpclient.URIException
- java.io.IOException
- +- org.apache.commons.httpclient.HttpException
- +- org.apache.commons.httpclient.URIException
URIException表示请求的URL不符合URI规范。
HTTP传输安全
有必要了解是HTTP协议并不适用于所有类型的应用程序。HTTP是一个简单的面向requestre/sponse的协议,协议最初设计为支持静态或动态生成的内容检索。它从未打算支持事务性操作。例如,如果HTTP服务器成功接收和处理该请求,HTTP服务器会考虑其履行契约的一部分,生成响应和发送状态码回客户端。如果客户端由于读取超时,请求取消,或者系统崩溃而导致读取整个响应失败,服务器将不试图回滚事务。如果客户端重新发送同一请求,服务器将最终无可避免再一次执行同一事务。在某些情况下,将有可能导致应用程序数据的损坏或程序状态的不一致。
即使HTTP从未被设计为支持事务性处理,它还是可以用作满足某些条件关键应用程序传输协议。为确保HTTP传输层安全系统必须确保应用层上的HTTP方法是幕等的。
幕等方法
HTTP/1.1规范定义幕等方法为:
Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
换句话说,应用程序应该确保它准备处理同一个的方法的多次执行带来的影响。这可以做到的,例如,通过提供一个唯一的事务id和通过其他方式避免执行相同的逻辑操作。
需要注意的,这是问题并非特定于HttpClient。基于浏览器的应用程序在涉及到非幕等HTTP方法时,也会面临同样的问题。
自动异常恢复
默认情况下HttpClient尝试从异常中自动恢复。默认的自动恢复机制仅限于少数的几个已知安全的异常。HttpClient不会尝试从任何逻辑或是HTTP协议错误(HttpException派生的异常类)中恢复。
HttpClient将最多5次自动重试因传输异常失败的方法,虽然请求仍被传输到目标服务器(也就是说,请求尚未完全传送到服务器)。
HttpClient将最多自动重试那些方法5次,直到请求完全传送到服务器,但该服务器没有响应的HTTP状态代码(服务器只是简单的丢弃连接而没有发回任何响应)。在这种情况下则假定请求未被服务器处理和应用程序状态没有改变。如果web服务器应用程序目标的假设不成立,那么极力建议您提供自定义的异常处理程序。
自定义异常处理类
为了启用自定义异常的恢复机制应提供HttpMethodRetryHandler接口的实现。
HttpClient client = new HttpClient(); HttpMethodRetryHandler myretryhandler = new HttpMethodRetryHandler() { public boolean retryMethod( final HttpMethod method, final IOException exception, int executionCount) { if (executionCount >= 5) { // Do not retry if over max retry count return false; } if (exception instanceof NoHttpResponseException) { // Retry if the server dropped connection on us return true; } if (!method.isRequestSent()) { // Retry if the request has not been sent fully or // if it's OK to retry methods that have been sent return true; } // otherwise do not retry return false; } }; GetMethod httpget = new GetMethod("http://www.whatever.com/"); httpget.getParams(). setParameter(HttpMethodParams.RETRY_HANDLER, myretryhandler); try { client.executeMethod(httpget); System.out.println(httpget.getStatusLine().toString()); } finally { httpget.releaseConnection(); }
相关推荐
Apache HttpClient是一个...协议拦截器(HTTPprotocolinterceptors)和异常处理(Exceptionhandling)是保持HTTP通信顺畅的关键组件,包括传输安全(transportsafety)、幂等方法(Idempotentmethods)、自动异常恢复...
12. **错误处理**:学习如何捕获和处理HttpClient可能抛出的异常,如`IOException`、`ProtocolException`等。 13. **与其他库的集成**:HttpClient可以与Spring、Apache CXF等其他库集成,以实现更复杂的网络功能。...
通过阅读手册,开发者可以迅速掌握HttpClient的使用方法,包括如何创建和执行HTTP请求,如何处理响应,以及如何进行异常处理。 四、源码获取与编译 `commons-httpclient-3.1-src.zip`包含了HttpClient 3.1的源代码...
- **异常处理:** - **HTTP传输安全性:** 在网络通信中,确保数据的安全传输是非常重要的。 - **幂等方法:** 幂等操作是指多次执行同一操作的效果等同于执行一次。 - **自动异常恢复:** 自动异常恢复机制可以...
10. **异常处理**:描述可能出现的网络异常,如SocketTimeoutException、ConnectException等,以及如何编写合适的异常处理逻辑。 11. **高级特性**:如多部分上传、HTTP/1.1与HTTP/2支持、AsyncHttpClient异步请求...
- **异常处理**:网络请求总是存在失败的风险,合理地捕获和处理HttpException和IOException等异常是必要的。 - **性能优化**:对于高并发场景,可以考虑使用线程池管理HttpClient实例,减少创建和销毁对象的成本。...
**2.4 I/O反应器异常处理** I/O反应器需要能够处理各种异常情况,包括但不限于连接中断、数据损坏等。 **2.5 非阻塞HTTP连接** **2.5.1 非阻塞HTTP连接的执行上下文** 非阻塞HTTP连接需要在一个适当的执行上下文中...
这份手册涵盖了Java编程的多个重要方面,包括基本规范、异常处理、并发控制、集合使用、IO流、网络编程、数据库操作以及日志记录等,为开发者提供了全面且实用的指导原则。 1. **基本规范**:这部分主要涉及命名...
手册会详细介绍语法、类、对象、接口、异常处理以及多态性等概念。 2. **VCL框架**:Visual Component Library(VCL)是Delphi用于构建用户界面的组件库。手册将解释如何使用这些组件来设计和布局UI,包括按钮、...
这份手册分为多个部分,涵盖了基础编程规范、异常处理、并发控制、数据访问、网络编程等多个方面,是Java开发者的重要参考文档。 在基础编程规范方面,手册强调了良好的命名习惯,如类名、方法名应使用全大写字母...
4. **异常处理**:讨论如何使用try-catch-finally语句处理程序运行时可能出现的错误,以及自定义异常。 5. **集合与数据结构**:介绍ArrayList、LinkedList、HashSet、Dictionary等集合类型,以及它们在不同场景下...
异常处理是Java编程中的重要环节,用于捕获和处理运行时错误。手册会讲解如何使用try-catch-finally语句块,以及如何定义自定义异常。 最后,单元测试和集成测试是确保代码质量的重要步骤。JUnit是Java常用的测试...
这份手册覆盖了Java语言的多个方面,包括但不限于基本语法、设计模式、异常处理、多线程、集合框架、IO流、网络编程、数据库操作以及性能优化等。 1. **编码规范**: - 命名规则:变量、方法、类、接口的命名应...
该手册涵盖了Java语言的各个主要方面,包括基础语法、集合框架、IO流、多线程、网络编程、反射、异常处理、垃圾回收等。通过深入学习和理解手册中的内容,你可以: 1. **基础语法**:掌握变量、数据类型、运算符、...
除此之外,手册可能还会覆盖到其他高级主题,如线程管理(System.Threading)、反射(System.Reflection)、泛型(Generics)、委托和事件(Delegates and Events)、异常处理(Exception Handling)以及单元测试...
用户手册还涉及了错误处理和异常管理,以及如何利用Apache虚拟文件系统(VFS)支持对多种文件格式进行处理。Apache VFS是一个用于访问不同文件系统类型和文件传输协议的抽象层,它允许Kettle在不同类型的文件系统...
其次,手册会涵盖C#中的异常处理和错误处理策略,这是防止程序崩溃和数据丢失的关键。学习如何正确抛出、捕获和处理异常,以及如何编写健壮的异常处理代码,是每个C#开发者必须掌握的技能。 在数据加密和解密方面,...
异常处理是保障程序稳定性的关键,书中会讲解如何使用try-catch-finally语句块进行异常捕获和处理,以及如何自定义异常类型。此外,还可能涉及防御性编程策略,以减少因错误处理不当导致的安全漏洞。 六、数据持久...
3. **异常处理** - 异常的概念:理解Checked异常和Unchecked异常的区别。 - try-catch-finally语句块:用于捕获和处理异常。 - 自定义异常:创建自己的异常类以适应特定需求。 4. **内存管理与垃圾回收** - ...
2. **异常处理** - 异常捕获:手册可能会强调正确处理异常的重要性,推荐使用try-catch-finally结构,以及何时抛出和捕获异常。 - 自定义异常:可能涉及到如何定义和使用自定义异常,以增强程序的可读性和可维护性...