// JExceptionMsg returns the exception message as a Go error, if an exception // occurred, or nil otherwise. func JExceptionMsg(env Env) error { jException := Object(uintptr(unsafe.Pointer(C.ExceptionOccurred(env.value())))) if jException.IsNull() { // no exception return nil } C.ExceptionDescribe(env.value()) C.ExceptionClear(env.value()) return GoError(env, jException) }
// GoError converts the provided Java Exception into a Go error, converting VException into // verror.T and all other exceptions into a Go error. func GoError(env Env, jException Object) error { if jException.IsNull() { return nil } if IsInstanceOf(env, jException, jVExceptionClass) { // VException: convert it into a verror. // Note that we can't use CallStaticObjectMethod below as it may lead to // an infinite loop. jmid, jArgArr, freeFunc, err := setupStaticMethodCall(env, jVomUtilClass, "encode", []Sign{ObjectSign, TypeSign}, ByteArraySign, jException, jVExceptionClass) if err != nil { return fmt.Errorf("error converting VException: " + err.Error()) } defer freeFunc() dataObj := C.CallStaticObjectMethodA(env.value(), jVomUtilClass.value(), jmid, jArgArr) if e := C.ExceptionOccurred(env.value()); e != nil { C.ExceptionClear(env.value()) return fmt.Errorf("error converting VException: exception during VomUtil.encode()") } data := GoByteArray(env, Object(uintptr(unsafe.Pointer(dataObj)))) var verr error if err := vom.Decode(data, &verr); err != nil { return fmt.Errorf("error converting VException: " + err.Error()) } return verr } // Not a VException: convert it into a Go error. // Note that we can't use CallObjectMethod below, as it may lead to an // infinite loop. jmid, jArgArr, freeFunc, err := setupMethodCall(env, jException, "getMessage", nil, StringSign) if err != nil { return fmt.Errorf("error converting exception: " + err.Error()) } defer freeFunc() strObj := C.CallObjectMethodA(env.value(), jException.value(), jmid, jArgArr) if e := C.ExceptionOccurred(env.value()); e != nil { C.ExceptionClear(env.value()) return fmt.Errorf("error converting exception: exception during Throwable.getMessage()") } return errors.New(GoString(env, Object(uintptr(unsafe.Pointer(strObj))))) }