# Re-throwing a Java exception loses the cause stack

**URL:** <https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146>\
**Category:** Ignition\
**Created:** [April 3, 2013, 12:30pm UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146 "2013-04-03T12:30:58Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![systemparadox](https://avatars.discourse-cdn.com/v4/letter/s/b5e925/32.png) [@systemparadox](https://forum.inductiveautomation.com/u/systemparadox)\
**Post date:** [April 3, 2013, 12:30pm UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/1 "2013-04-03T12:30:58Z")

</div>

We’re having trouble getting our global exception handler to re-throw exceptions cleanly.

Add the following to any arbitrary event script (like a button click):

```auto
system.db.runQuery("FAIL")
```

Running this event causes Ignition to raise the error dialog with a nice traceback:

```auto
Traceback (most recent call last):
  File "<event:actionPerformed>", line 1, in <module>
    at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:319)
    at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runQuery(AbstractDBUtilities.java:290)
    at sun.reflect.GeneratedMethodAccessor559.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)

java.lang.Exception: java.lang.Exception: Error executing system.db.runQuery(FAIL, , )

    at org.python.core.PyException.fillInStackTrace(PyException.java:70)
    at java.lang.Throwable.<init>(Throwable.java:181)
    at java.lang.Exception.<init>(Exception.java:29)
    at java.lang.RuntimeException.<init>(RuntimeException.java:32)
    at org.python.core.PyException.<init>(PyException.java:46)
    at org.python.core.PyException.<init>(PyException.java:43)
    at org.python.core.Py.JavaError(Py.java:495)
    at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:319)
    at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runQuery(AbstractDBUtilities.java:290)
    at sun.reflect.GeneratedMethodAccessor559.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.python.core.PyReflectedFunction. __call__ (PyReflectedFunction.java:186)
    at com.inductiveautomation.ignition.common.script.ScriptManager$ReflectedInstanceFunction. __call__ (ScriptManager.java:455)
    at org.python.core.PyObject. __call__ (PyObject.java:387)
    at org.python.core.PyObject. __call__ (PyObject.java:391)
    at org.python.pycode._pyx289.f$0(<event:actionPerformed>:1)
    at org.python.pycode._pyx289.call_function(<event:actionPerformed>)
    at org.python.core.PyTableCode.call(PyTableCode.java:165)
    at org.python.core.PyCode.call(PyCode.java:18)
    at org.python.core.Py.runCode(Py.java:1275)
    at com.inductiveautomation.ignition.common.script.ScriptManager.runCode(ScriptManager.java:548)
    at com.inductiveautomation.factorypmi.application.binding.action.ActionAdapter.runActions(ActionAdapter.java:155)
    at com.inductiveautomation.factorypmi.application.binding.action.ActionAdapter.invoke(ActionAdapter.java:266)
    at com.inductiveautomation.factorypmi.application.binding.action.RelayInvocationHandler.invoke(RelayInvocationHandler.java:55)
    at $Proxy17.actionPerformed(Unknown Source)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    <SNIP>
Caused by: java.lang.Exception: Error executing system.db.runQuery(FAIL, , )
Caused by: com.inductiveautomation.ignition.client.gateway_interface.GatewayException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FAIL' at line 1
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FAIL' at line 1
```

Now try:

```auto
try:
    system.db.runQuery("FAIL")
except:
    raise
```

Notice how the exception stack has changed, and is now missing the cause stack:

```auto
Traceback (most recent call last):
  File "<event:actionPerformed>", line 3, in <module>
    at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:319)
    at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runQuery(AbstractDBUtilities.java:290)
    at sun.reflect.GeneratedMethodAccessor559.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)

java.lang.Exception: java.lang.Exception: Error executing system.db.runQuery(FAIL, , )

    at org.python.core.PyException.fillInStackTrace(PyException.java:70)
    at java.lang.Throwable.<init>(Throwable.java:181)
    at java.lang.Exception.<init>(Exception.java:29)
    at java.lang.RuntimeException.<init>(RuntimeException.java:32)
    at org.python.core.PyException.<init>(PyException.java:46)
    at org.python.core.PyException.doRaise(PyException.java:200)
    at org.python.core.Py.makeException(Py.java:1239)
    at org.python.core.Py.makeException(Py.java:1243)
    at org.python.core.Py.makeException(Py.java:1247)
    at org.python.core.Py.makeException(Py.java:1251)
    at org.python.pycode._pyx293.f$0(<event:actionPerformed>:5)
    at org.python.pycode._pyx293.call_function(<event:actionPerformed>)
    at org.python.core.PyTableCode.call(PyTableCode.java:165)
    at org.python.core.PyCode.call(PyCode.java:18)
    at org.python.core.Py.runCode(Py.java:1275)
    at com.inductiveautomation.ignition.common.script.ScriptManager.runCode(ScriptManager.java:548)
    at com.inductiveautomation.factorypmi.application.binding.action.ActionAdapter.runActions(ActionAdapter.java:155)
    at com.inductiveautomation.factorypmi.application.binding.action.ActionAdapter.invoke(ActionAdapter.java:266)
    at com.inductiveautomation.factorypmi.application.binding.action.RelayInvocationHandler.invoke(RelayInvocationHandler.java:55)
    at $Proxy17.actionPerformed(Unknown Source)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    <SNIP>
```

Without being able to modify Ignition’s exception handler I am unable to find out where the cause is getting lost.

Any further information on this issue would be much appreciated. I am hoping there is a simple workaround.

Thanks.

---

<div class="post-metadata">

**Author:** ![chi](https://avatars.discourse-cdn.com/v4/letter/c/0ea827/32.png) [@chi](https://forum.inductiveautomation.com/u/chi)\
**Post date:** [April 3, 2013, 1:24pm UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/2 "2013-04-03T13:24:19Z")

</div>

Did you try

```auto
try:
	system.db.runQuery("FAIL")
except Exception:
	raise
```

For me this displays the cause stack:

```auto
Traceback (most recent call last):
  File "<script playground>", line 2, in <module>
  File "<script playground>", line 2, in <module>
	at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:323)

	at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runQuery(AbstractDBUtilities.java:294)

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

	at java.lang.reflect.Method.invoke(Unknown Source)

java.lang.Exception: java.lang.Exception: Error executing system.db.runQuery(FAIL, , )

	at org.python.core.PyException.fillInStackTrace(PyException.java:70)
	at java.lang.Throwable.<init>(Throwable.java:181)
	at java.lang.Exception.<init>(Unknown Source)
	at java.lang.RuntimeException.<init>(Unknown Source)
	at org.python.core.PyException.<init>(PyException.java:46)
	at org.python.core.PyException.<init>(PyException.java:43)
	at org.python.core.Py.JavaError(Py.java:495)
	at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:323)
	at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runQuery(AbstractDBUtilities.java:294)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.python.core.PyReflectedFunction. __call__ (PyReflectedFunction.java:186)
	at com.inductiveautomation.ignition.common.script.ScriptManager$ReflectedInstanceFunction. __call__ (ScriptManager.java:455)
	at org.python.core.PyObject. __call__ (PyObject.java:387)
	at org.python.core.PyObject. __call__ (PyObject.java:391)
	at org.python.pycode._pyx17.f$0(<script playground>:4)
	at org.python.pycode._pyx17.call_function(<script playground>)
	at org.python.core.PyTableCode.call(PyTableCode.java:165)
	at org.python.core.PyCode.call(PyCode.java:18)
	at org.python.core.Py.runCode(Py.java:1275)
	at com.inductiveautomation.ignition.common.script.ScriptManager.runCode(ScriptManager.java:548)
	at com.inductiveautomation.ignition.common.script.ScriptManager.runCode(ScriptManager.java:541)
	at com.inductiveautomation.ignition.designer.gui.tools.ScriptPlayground.runScript(ScriptPlayground.java:203)
	at com.inductiveautomation.ignition.designer.gui.tools.ScriptPlayground$2.actionPerformed(ScriptPlayground.java:219)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.awt.EventQueue$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.Exception: Error executing system.db.runQuery(FAIL, , )
	... 56 more
Caused by: com.inductiveautomation.ignition.client.gateway_interface.GatewayException: Connection Error: Die voreingestellte Projekt Datenquelle wurde nicht gefunden.
	at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.newGatewayException(GatewayInterface.java:313)
	at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.sendMessage(GatewayInterface.java:287)
	at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.sendMessage(GatewayInterface.java:244)
	at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.runLimitQuery(GatewayInterface.java:712)
	at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.runQuery(GatewayInterface.java:671)
	at com.inductiveautomation.ignition.client.script.ClientDBUtilities._runQuery(ClientDBUtilities.java:164)
	at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runQuery(AbstractDBUtilities.java:290)
	... 54 more
Caused by: com.inductiveautomation.ignition.gateway.web.util.ErrorMessageException: Die voreingestellte Projekt Datenquelle wurde nicht gefunden.
	at com.inductiveautomation.ignition.gateway.servlets.gateway.functions.AbstractDBAction.getDatasourceName(AbstractDBAction.java:121)
	at com.inductiveautomation.ignition.gateway.servlets.gateway.functions.AbstractDBAction.invoke(AbstractDBAction.java:58)
	at com.inductiveautomation.ignition.gateway.servlets.Gateway.doPost(Gateway.java:398)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at com.inductiveautomation.ignition.gateway.bootstrap.MapServlet.service(MapServlet.java:85)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(null)

Ignition v7.5.6 (b1316)
Java: Sun Microsystems Inc. 1.6.0_34
```

---

<div class="post-metadata">

**Author:** ![systemparadox](https://avatars.discourse-cdn.com/v4/letter/s/b5e925/32.png) [@systemparadox](https://forum.inductiveautomation.com/u/systemparadox)\
**Post date:** [April 4, 2013, 7:56am UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/3 "2013-04-04T07:56:54Z")

</div>

[quote=“chi”]Did you try

```auto
try:
	system.db.runQuery("FAIL")
except Exception:
	raise
```

For me this displays the cause stack  
[/quote]

That’s because system.db.runQuery throws a java.lang.Exception, but you’re only catching a python Exception. They don’t inherit from each other.

If you were to change this to:

```auto
import java
try:
	system.db.runQuery("FAIL")
except java.lang.Exception:
	raise
```

Then it would catch the exception and you’d have the same problem as me.

EDIT: This used to catch java.lang.Throwable (the parent interface of java.lang.Exception), but according to the Java documentation that includes some things you probably don’t ever want to catch.

---

<div class="post-metadata">

**Author:** ![chi](https://avatars.discourse-cdn.com/v4/letter/c/0ea827/32.png) [@chi](https://forum.inductiveautomation.com/u/chi)\
**Post date:** [April 4, 2013, 8:46am UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/4 "2013-04-04T08:46:14Z")

</div>

Hmm, for me

```auto
system.db.runQuery("FAIL")
```

and

```auto
try:
	system.db.runQuery("FAIL")
except Exception:
	raise
```

result in exactly the same StackTrace in the error dialog (Except for the changed line number), including the full cause stack. Both throw a ‘java.lang.Exception’.

Do you need the Throwable at some other place in your own handler?

---

<div class="post-metadata">

**Author:** ![systemparadox](https://avatars.discourse-cdn.com/v4/letter/s/b5e925/32.png) [@systemparadox](https://forum.inductiveautomation.com/u/systemparadox)\
**Post date:** [April 4, 2013, 12:11pm UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/5 "2013-04-04T12:11:50Z")

</div>

Sorry I think I’ve caused some confusion there. Throwable is just the interface that all Java exceptions implement. I thought it was better to catch the generic Throwable, but I’ve since read up on the Java documentation and it’s better to just catch Exception. Other Throwables include very serious errors that really aren’t recoverable so I’ll leave Ignition and Java to deal with those. I’ve edited my previous post to avoid confusing anyone else.

To clarify:

```auto
try:
	system.db.runQuery("FAIL")
except Exception:
	print 'caught'
	raise
```

Does not print ‘caught’ because the exception is not caught. The system.db call throws a java.lang.Exception, which does not inherit from the python Exception class.

The following does catch the exception:

```auto
import java
try:
	system.db.runQuery("FAIL")
except java.lang.Exception:
	print 'caught'
	raise
```

But then the cause stack will be missing.

---

<div class="post-metadata">

**Author:** ![Carl.Gould](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/carl.gould/32/7262_2.png) [@Carl.Gould](https://forum.inductiveautomation.com/u/Carl.Gould)\
**Post date:** [April 11, 2013, 8:10pm UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/6 "2013-04-11T20:10:02Z")

</div>

Well…this is just a quirk of Jython. In the desired case, I get a PyException that has a proper cause chain. In the other case, I get a PyException whose cause is itself, thus ending the caused-by chain.

---

<div class="post-metadata">

**Author:** ![chi](https://avatars.discourse-cdn.com/v4/letter/c/0ea827/32.png) [@chi](https://forum.inductiveautomation.com/u/chi)\
**Post date:** [April 16, 2013, 12:28pm UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/7 "2013-04-16T12:28:22Z")

</div>

Sorry, i missunderstood the problem in the beginning.

Here is what i do to prevent the default exception dialog. Maybe it is heplful, even if it is not exactly what you need. Basically i don’t raise the exception again but show an error box:

```auto
from java.lang import Throwable

try:
	# Do something bad...
except Throwable, ex:
	from java.io import StringWriter
	from java.io import PrintWriter
	# Get the stacktrace
	sWriter = StringWriter()
	ex.printStackTrace(PrintWriter(sWriter))

	system.gui.errorBox(sWriter.toString(), ex.getMessage())
```

or use the default exception dialog:

```auto
except Throwable, ex:
	from com.inductiveautomation.ignition.client.util.gui import ErrorUtil
	ErrorUtil.showError(ex.getMessage(), "Exception", ex)
```

---

<div class="post-metadata">

**Author:** ![Carl.Gould](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/carl.gould/32/7262_2.png) [@Carl.Gould](https://forum.inductiveautomation.com/u/Carl.Gould)\
**Post date:** [April 16, 2013, 3:22pm UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/8 "2013-04-16T15:22:56Z")

</div>

Sure, that works. That’s the same thing that the script’s error handler or our end is doing, it’s just that your re-thrown exception loses the pertinent info.

---

<div class="post-metadata">

**Author:** ![systemparadox](https://avatars.discourse-cdn.com/v4/letter/s/b5e925/32.png) [@systemparadox](https://forum.inductiveautomation.com/u/systemparadox)\
**Post date:** [April 19, 2013, 2:34pm UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/9 "2013-04-19T14:34:40Z")

</div>

Thanks chi, using ErrorUtil.showError solves the problem.

---

<div class="post-metadata">

**Author:** ![drewdin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/drewdin/32/3363_2.png) [@drewdin](https://forum.inductiveautomation.com/u/drewdin)\
**Post date:** [December 24, 2019, 4:41pm UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/10 "2019-12-24T16:41:00Z")

</div>

Is there any way to just get the caused by part of the stack? I don’t want to diplay anything else

---

<div class="post-metadata">

**Author:** ![systemparadox](https://avatars.discourse-cdn.com/v4/letter/s/b5e925/32.png) [@systemparadox](https://forum.inductiveautomation.com/u/systemparadox)\
**Post date:** [January 16, 2020, 11:16am UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/11 "2020-01-16T11:16:32Z")

</div>

@drewdin yes there is. In Java, exceptions have a `.cause` property, which gives you a chain that you can traverse down. For example:

```auto
try:
    system.db.runQuery('FAIL')
except java.lang.Exception, err:
    while getattr(err, 'cause', None):
        err = err.cause
    print err

```

However, you have to be a bit careful with this. Often the originating exception at the bottom of the stack contains all the information you need, but sometimes it’s completely meaningless or meaningless without additional context from further up the stack.

---

<div class="post-metadata">

**Author:** ![drewdin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/drewdin/32/3363_2.png) [@drewdin](https://forum.inductiveautomation.com/u/drewdin)\
**Post date:** [January 16, 2020, 1:51pm UTC](https://forum.inductiveautomation.com/t/re-throwing-a-java-exception-loses-the-cause-stack/6146/12 "2020-01-16T13:51:56Z")

</div>

> [@systemparadox](#):
>
> try: system.db.runQuery('FAIL') except java.lang.Exception, err: while getattr(err, 'cause', None): err = err.cause print err

awesome, ill try it out. Thanks!
