@@ -47,19 +47,23 @@ public class RemoteEndpoint implements Endpoint, MessageConsumer, MethodProvider
4747 && throwable .getCause () instanceof ResponseErrorException ) {
4848 return ((ResponseErrorException ) throwable .getCause ()).getResponseError ();
4949 } else {
50- LOG .log (Level .SEVERE , "Internal error: " + throwable .getMessage (), throwable );
51- ResponseError error = new ResponseError ();
52- error .setMessage ("Internal error." );
53- error .setCode (ResponseErrorCode .InternalError );
54- ByteArrayOutputStream stackTrace = new ByteArrayOutputStream ();
55- PrintWriter stackTraceWriter = new PrintWriter (stackTrace );
56- throwable .printStackTrace (stackTraceWriter );
57- stackTraceWriter .flush ();
58- error .setData (stackTrace .toString ());
59- return error ;
50+ return fallbackResponseError ("Internal error" , throwable );
6051 }
6152 };
62-
53+
54+ private static ResponseError fallbackResponseError (String header , Throwable throwable ) {
55+ LOG .log (Level .SEVERE , header + ": " + throwable .getMessage (), throwable );
56+ ResponseError error = new ResponseError ();
57+ error .setMessage (header + "." );
58+ error .setCode (ResponseErrorCode .InternalError );
59+ ByteArrayOutputStream stackTrace = new ByteArrayOutputStream ();
60+ PrintWriter stackTraceWriter = new PrintWriter (stackTrace );
61+ throwable .printStackTrace (stackTraceWriter );
62+ stackTraceWriter .flush ();
63+ error .setData (stackTrace .toString ());
64+ return error ;
65+ }
66+
6367 private final MessageConsumer out ;
6468 private final Endpoint localEndpoint ;
6569 private final Function <Throwable , ResponseError > exceptionHandler ;
@@ -76,7 +80,10 @@ private static class PendingRequestInfo {
7680 RequestMessage requestMessage ;
7781 Consumer <ResponseMessage > responseHandler ;
7882 }
79-
83+
84+ /**
85+ * @param exceptionHandler An exception handler that should never return null.
86+ */
8087 public RemoteEndpoint (MessageConsumer out , Endpoint localEndpoint , Function <Throwable , ResponseError > exceptionHandler ) {
8188 if (out == null )
8289 throw new NullPointerException ("out" );
@@ -217,10 +224,11 @@ protected void handleRequest(RequestMessage requestMessage) {
217224 future = localEndpoint .request (requestMessage .getMethod (), requestMessage .getParams ());
218225 } catch (Throwable e ) {
219226 ResponseError errorObject = exceptionHandler .apply (e );
220- if (errorObject != null ) {
221- ResponseMessage responseMessage = createErrorResponseMessage (requestMessage , errorObject );
222- out .consume (responseMessage );
227+ if (errorObject == null ) {
228+ errorObject = fallbackResponseError ("Internal error. Exception handler provided no error object" , e );
223229 }
230+ ResponseMessage responseMessage = createErrorResponseMessage (requestMessage , errorObject );
231+ out .consume (responseMessage );
224232 return ;
225233 }
226234 synchronized (receivedRequestMap ) {
@@ -237,11 +245,10 @@ protected void handleRequest(RequestMessage requestMessage) {
237245 responseMessage = createErrorResponseMessage (requestMessage , errorObject );
238246 } else {
239247 ResponseError errorObject = exceptionHandler .apply (t );
240- if (errorObject != null ) {
241- responseMessage = createErrorResponseMessage (requestMessage , errorObject );
242- } else {
243- responseMessage = createResponseMessage (requestMessage );
248+ if (errorObject == null ) {
249+ errorObject = fallbackResponseError ("Internal error. Exception handler provided no error object" , t );
244250 }
251+ responseMessage = createErrorResponseMessage (requestMessage , errorObject );
245252 }
246253 out .consume (responseMessage );
247254 return null ;
0 commit comments