Tag: exception

Java SDK for REST API服务的error handling

我们正在构建Java SDK以简化对提供REST API的服务的访问。 此SDK将由第三方开发人员使用。 我很难找到最适合在Java语言中实现error handling的模式。 假设我们有其余的端点: GET /photos/{photoId} 。 这可能会返回以下HTTP状态代码: 401:用户未经过身份validation 403:用户无权访问此照片 404:没有带有该ID的照片 该服务看起来像这样: interface RestService { public Photo getPhoto(String photoID); } 在上面的代码中,我还没有解决error handling问题。 我显然希望为sdk的客户端提供一种方法来知道发生了哪个错误,以便从中恢复。 Java中的error handling是使用Exceptions完成的,所以让我们继续。 但是,使用exception执行此操作的最佳方法是什么? 1.有一个关于错误信息的例外。 public Photo getPhoto(String photoID) throws RestServiceException; public class RestServiceException extends Exception { int statusCode; … } 然后sdk的客户端可以执行以下操作: try { Photo photo = getPhoto(“photo1”); } catch(RestServiceException […]

调试时强制exception

是否可以在调试时强制抛出exception。 让我举个例子:我正在调试一些从互联网上下载页面的代码。 当Internet连接丢失或网卡关闭时,应抛出IOException,而不是执行阻塞(在第二行) URLConnection connection = requestURL.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 我需要一种方法来强制抛出exception, 同时调试代码阻塞,所以我可以跳转到catch块。 我正在使用netbeans BTW。 在执行线程暂停时手动添加Debugging =。 编辑 :换句话说,我需要注入 – 在运行时调用exception,而不影响当前代码! 谢谢。

将有用的状态信息传递给Java中的exception有什么好方法?

我最初注意到我的问题引起了一些困惑。 我不是在询问如何配置记录器,也不是如何正确使用记录器,而是如何捕获本地记录级别低于exception消息中当前日志记录级别记录的所有信息。 我一直在注意Java中的两种模式,用于记录在发生exception时可能对开发人员有用的信息。 以下模式似乎很常见。 基本上,您只需根据需要在线记录您的记录器日志信息,以便在发生exception时获得日志跟踪。 try { String myValue = someObject.getValue(); logger.debug(“Value: {}”, myValue); doSomething(myValue); } catch (BadThingsHappenException bthe) { // consider this a RuntimeException wrapper class throw new UnhandledException(bthe); } 上述方法的缺点是,如果您的用户需要相对安静的日志并且需要高级别的可靠性,而他们无法“在调试模式下再次尝试”,则exception消息本身包含的数据不足以对开发者有用。 我看到的下一个模式试图缓解这个问题,但看起来很难看: String myValue = null; try { myValue = someObject.getValue(); doSomething(myValue); } catch (BadThingsHappenException bthe) { String pattern = “An error occurred when […]

什么可能导致套接字ConnectException:连接超时?

我们有一个Webstart客户端,它通过使用java.net.HttpsURLConnection通过HTTPS发送序列化对象来与服务器通信。 在我的本地机器和办公室的测试服务器上,一切都运行得很好,但我遇到了一个非常非常奇怪的问题,这个问题只发生在我们的生产和登台服务器上(偶尔也会发生)。 我知道这些服务器和我们办公室的服务器之间的主要区别在于它们位于其他地方并且客户端 – 服务器与它们的通信速度相当慢,但在此之前它在生产中也能正常工作。 无论如何,这是发生了什么: 客户端在设置读取超时和HttpURLConnection上的Content-Type等属性之后调用其上的getOutputStream()以获取要写入的流。 此时,据我所知,客户端会挂起一段时间。 然后客户端抛出以下exception: java.net.ConnectException:连接超时:连接 at java.net.PlainSocketImpl.socketConnect(Native Method) 在java.net.PlainSocketImpl.doConnect(未知来源) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 在java.net.PlainSocketImpl.connect(未知来源) 在java.net.SocksSocketImpl.connect(未知来源) 在java.net.Socket.connect(未知来源) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source) 在com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(未知来源) 在sun.net.NetworkClient.doConnect(未知来源) 在sun.net.www.http.HttpClient.openServer(未知来源) 在sun.net.www.http.HttpClient.openServer(未知来源) 在sun.net.www.protocol.https.HttpsClient。(未知来源) 在sun.net.www.protocol.https.HttpsClient.New(未知来源) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source) 在sun.net.www.protocol.http.HttpURLConnection.plainConnect(未知来源) 在sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(未知来源) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source) 请注意,这不是SocketTimeoutException , HttpURLConnection上的connect()方法表示如果在建立连接之前超时到期,它将抛出。 此外,当发生这种情况时,我能够调用conn.getResponseCode()并获得200的响应代码。 在服务器端,在ObjectInputStream的构造函数中抛出EOFException ,该构造函数尝试读取序列化头但由于客户端永远不会获取要写入的OutputStream而失败。 如果它有帮助,这里是在调用getOutputStream()之前在HttpsURLConnection进行的调用(编辑后只显示正在进行的调用而不是代码的整个结构这样做): HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setUseCaches(false); conn.setReadTimeout(30000); conn.setRequestProperty(“Cookie”, […]

如何以安全可读的方式处理我知道永远不会抛出的IOException?

“可能出错的事情与不可能出错的事情之间的主要区别在于,当一件不可能出错的事情出错时,通常会发现无法进入或修复。” -道格拉斯·亚当斯 我有一个类FileItems。 FileItems构造函数接受一个文件,如果该文件不存在则抛出exception(FileNotFoundException)。 该类的其他方法也涉及文件操作,因此具有抛出FileNotFoundException的能力。 我想找到一个更好的解决方案。 一种解决方案,不需要其他程序员处理所有这些极不可能的FileNotFoundExceptions。 事情的事实: 该文件已被检查存在,但存在极不可能的可能性,通过一些重大的现实错误,在调用此方法之前可能会删除该文件。 由于1发生的可能性非常不同且不可恢复,我宁愿定义未经检查的exception。 该文件已经被发现存在,迫使其他程序员编写代码并捕获已检查的FileNotFoundException,这看起来既乏味又无用。 该程序应该在那时完全失败。 例如,计算机总是有可能着火,但没有人疯狂到足以迫使其他程序员将其作为检查exception来处理 。 我不时遇到这种exception问题,并且每次遇到这个问题时定义自定义未经检查的exception(我的旧解决方案)都很烦人并且增加了代码膨胀。 代码目前看起来像这样 public Iterator getFileItemsIterator() { try{ Scanner sc = new Scanner(this.fileWhichIsKnowToExist); return new specialFileItemsIterator(sc); } catch (FileNotFoundException e){ //can never happen} return null; } 如何在不定义自定义未经检查的FileNotFoundException的情况下更好地完成此操作? 有没有办法将checkedException转换为uncheckException?

自动exception处理

我想知道是否存在某些东西(在Java世界中)能够使用以下function拍摄JVM当前状态的快照: 在抛出exception时执行此操作。 捕获局部变量,方法的参数等。 将它放在一个方便的文件中,该文件可用于在IDE中提取或重现源代码中的情况。 需要两个第一个function(第三个function很棒)。 它必须适合生产使用(因此,没有办法调试器)。 在问这个问题之前,我已经搜索了WWW(尽可能长),并找到了一些指示: Cajoon拦截器 :正如在Dzonepost中所说 ,它是一个被动JVM代理,满足三个要求! 但是,它有两个缺点:你必须支付它并且网站已关闭(可能没有机会支付任何费用)。 AviCode Intercept Studio :Cajoon的.NET等价物。 只是为了提供一些见解。 JavaFrame :好的,这是一条推文,但是它指向一个可用的SVN 仓库 ,它有一个JVM代理的源代码(在MIT许可下)看起来很好(我打算尝试一下)。 那么,也许我正在寻找一种不存在的解决方案? 这并不紧急,但我有一个项目的想法,探索这个“未知”(?)路径并获得真实的东西会很棒。 似乎很明显它将是一个JVM代理( 例如来自JVMTI的exception事件)。 最后,我将重点介绍维基百科的exception处理文章中的以下段落: 在Java或.NET等运行时引擎环境中,存在附加到运行时引擎的工具,每次发生感兴趣的exception时,它们都会记录抛出exception时存在于内存中的调试信息(调用堆栈和堆栈)值)。 这些工具称为自动exception处理或错误拦截工具,并为exception提供“根本原因”信息。 这就是主意。 我希望有人可以给我一些见解,或者将来,有人会受到这篇不起眼的post的启发:) 谢谢!

如何处理陈旧的连接?

Ours是一个J2EE应用程序,在大型机/ DB2后端的Websphere 6.1上使用Struts-EJB-Hibernate,最近已转移到生产环境。 当用户第一次登录应用程序或有时间歇性地发生此exception时, 我们会收到过时的连接exception 。 在第二次尝试用户能够登录到应用程序。 我得到的确切错误信息是 empcom.ibm.websphere.ce.cm.StaleConnectionException: Execution failed due to a distribution protocol error that caused deallocation of the conversation. The command requested could not be completed because of a permanent error condition detected at the target system. DB2ConnectionCorrelator: AC100B80.A260.090107181206 我在webshere设置中启用了PRETEST选项,并将间隔设为60秒,但我仍然遇到此问题。 请分享您的观点并帮助我 如果需要,我可以给你更多细节。

在Eclipse IDE中调试Java时将exception作为表达式捕获

Java开发人员的日常调试情况是抛出exception,然后您需要深入研究调试器以找出抛出的内容。 通常,您会尝试在抛出exception之前设置一些断点,并希望您能够确定导致该exception的情况。 在Eclipse中,断点可以定义一个表达式,只有当变量x等于值y时才会触发断点。 我的问题是,是否有可能定义某种全局表达式,一旦抛出exception,它就被调试器捕获,允许程序员立即检查所有变量? 理想情况下,您还没有遇到catch块,Eclipse会捕获引发的exception并停止执行而不更改堆栈内容。 这是可能的还是受JVM的限制?

当方法签名不允许抛出exception时,如何抛出exception?

我有这样的方法: public void getSomething(){ … } 我想在getSomething()抛出一个Exception 。 编译器不允许我这样做,因为我的方法不允许在那里抛出exception。 但我需要为我的测试抛出一个Exception的子类(我不能抛出Unchecked Exception ) 。 这显然是一个黑客,但我需要它进行测试。 我试过EasyMock,但它也不允许我这样做。 任何想法如何做到这一点? 谢谢,Sean Nguyen

JVM如何保证finally块的执行?

这个问题针对的是JVM如何能够保证finally块的执行 (假设JVM没有崩溃并且线程没有被中断或退出)。 在面试问题的提示下,我试图了解JVM如何确保即使在奇怪的情况下也能执行finally块…请考虑以下代码: try{ int[] someArray = new int[10]; int invalid = someArray[10]; } catch(IndexOutOfBoundsException e){ throw new RuntimeException(“Other Exception”); } finally{ //close open files or HTTP connections etc. } 虽然这可能是一个奇怪的情况,但仍然保证执行finally块,尽管没有明确处理其他exception 。 JVM如何处理这样的情况? 我的想法: 根据我的理解并且到目前为止已经读过,当遇到未处理的exception时,控制从当前线程传递到我认为的那个线程的ThreadGroup 。 ThreadGroup中是否有一些条款可以检查最终需要执行的块? 我能想到的唯一另一件事就是finally块的地址可能存储在某个地方。 然后JVM在检测到exception时执行goto,并在finally块执行完毕后返回exception。 谁能澄清这个过程究竟是如何发生的?