Skip to content

Commit aea8a07

Browse files
committed
better exception handling more tests
1 parent d2bac5a commit aea8a07

5 files changed

Lines changed: 66 additions & 3 deletions

File tree

src/utils.cpp

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "utils.h"
33
#include <string.h>
44
#include <algorithm>
5+
#include <sstream>
56
#include "javaObject.h"
67

78
std::list<jobject> javaReflectionGetMethods(JNIEnv *env, jclass clazz) {
@@ -266,8 +267,30 @@ jarray v8ToJava(JNIEnv* env, const v8::Arguments& args, int start, int end, std:
266267
v8::Handle<v8::Value> javaExceptionToV8(JNIEnv* env, jthrowable ex, const std::string& alternateMessage) {
267268
v8::HandleScope scope;
268269

269-
std::string msg = alternateMessage + "\n" + javaObjectToString(env, ex);
270-
return scope.Close(v8::Exception::TypeError(v8::String::New(msg.c_str())));
270+
std::ostringstream msg;
271+
msg << alternateMessage;
272+
273+
if(ex) {
274+
jclass stringWriterClazz = env->FindClass("java/io/StringWriter");
275+
jmethodID stringWriter_constructor = env->GetMethodID(stringWriterClazz, "<init>", "()V");
276+
jmethodID stringWriter_toString = env->GetMethodID(stringWriterClazz, "toString", "()Ljava/lang/String;");
277+
jobject stringWriter = env->NewObject(stringWriterClazz, stringWriter_constructor);
278+
279+
jclass printWriterClazz = env->FindClass("java/io/PrintWriter");
280+
jmethodID printWriter_constructor = env->GetMethodID(printWriterClazz, "<init>", "(Ljava/io/Writer;)V");
281+
jobject printWriter = env->NewObject(printWriterClazz, printWriter_constructor, stringWriter);
282+
283+
jclass throwableClazz = env->FindClass("java/lang/Throwable");
284+
jmethodID throwable_printStackTrace = env->GetMethodID(throwableClazz, "printStackTrace", "(Ljava/io/PrintWriter;)V");
285+
env->CallObjectMethod(ex, throwable_printStackTrace, printWriter);
286+
287+
jstring strObj = (jstring)env->CallObjectMethod(stringWriter, stringWriter_toString);
288+
std::string stackTrace = javaToString(env, strObj);
289+
290+
msg << "\n" << stackTrace;
291+
}
292+
293+
return scope.Close(v8::Exception::Error(v8::String::New(msg.str().c_str())));
271294
}
272295

273296
v8::Handle<v8::Value> javaExceptionToV8(JNIEnv* env, const std::string& alternateMessage) {

test/Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ public Test() {}
66
public Test(int i) { this.i = i; }
77

88
public int getInt() { return i; }
9-
}
9+
}

test/TestExceptions.class

278 Bytes
Binary file not shown.

test/TestExceptions.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
public class TestExceptions {
3+
public TestExceptions(Exception ex) throws Exception { throw ex; }
4+
}

test/java-test.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,40 @@ exports['Java'] = nodeunit.testCase({
6464
});
6565
test.done();
6666
},
67+
68+
"newInstance bad number of args": function(test) {
69+
java.newInstance("Test", 42, "z", function(err, result) {
70+
test.ok(err);
71+
test.ok(!result);
72+
test.done();
73+
});
74+
},
75+
76+
"newInstanceSync bad number of args": function(test) {
77+
test.throws(function() {
78+
java.newInstanceSync("Test", 42, "z");
79+
});
80+
test.done();
81+
},
82+
83+
"newInstance exception thrown from constructor": function(test) {
84+
var ex = java.newInstanceSync("java.lang.Exception", "my exception");
85+
java.newInstance("TestExceptions", ex, function(err, result) {
86+
test.ok(err);
87+
test.ok(err.toString().match(/my exception/));
88+
test.ok(!result);
89+
test.done();
90+
});
91+
},
92+
93+
"newInstanceSync exception thrown from constructor": function(test) {
94+
var ex = java.newInstanceSync("java.lang.Exception", "my exception");
95+
try {
96+
java.newInstanceSync("TestExceptions", ex);
97+
test.fail("should throw");
98+
} catch(err) {
99+
test.ok(err.toString().match(/my exception/));
100+
}
101+
test.done();
102+
},
67103
});

0 commit comments

Comments
 (0)