Skip to content

Commit

Permalink
[SPARK-11322] [PYSPARK] Keep full stack trace in captured exception
Browse files Browse the repository at this point in the history
JIRA: https://issues.apache.org/jira/browse/SPARK-11322

As reported by JoshRosen in [databricks/spark-redshift/issues/89](databricks/spark-redshift#89 (comment)), the exception-masking behavior sometimes makes debugging harder. To deal with this issue, we should keep full stack trace in the captured exception.

Author: Liang-Chi Hsieh <[email protected]>

Closes apache#9283 from viirya/py-exception-stacktrace.
  • Loading branch information
viirya authored and davies committed Oct 29, 2015
1 parent 0cb7662 commit 3dfa4ea
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 4 deletions.
6 changes: 6 additions & 0 deletions python/pyspark/sql/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1079,6 +1079,12 @@ def test_capture_illegalargument_exception(self):
df = self.sqlCtx.createDataFrame([(1, 2)], ["a", "b"])
self.assertRaisesRegexp(IllegalArgumentException, "1024 is not in the permitted values",
lambda: df.select(sha2(df.a, 1024)).collect())
try:
df.select(sha2(df.a, 1024)).collect()
except IllegalArgumentException as e:
self.assertRegexpMatches(e.desc, "1024 is not in the permitted values")
self.assertRegexpMatches(e.stackTrace,
"org.apache.spark.sql.functions")

def test_with_column_with_existing_name(self):
keys = self.df.withColumn("key", self.df.key).select("key").collect()
Expand Down
19 changes: 15 additions & 4 deletions python/pyspark/sql/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,22 @@
import py4j


class AnalysisException(Exception):
class CapturedException(Exception):
def __init__(self, desc, stackTrace):
self.desc = desc
self.stackTrace = stackTrace

def __str__(self):
return repr(self.desc)


class AnalysisException(CapturedException):
"""
Failed to analyze a SQL query plan.
"""


class IllegalArgumentException(Exception):
class IllegalArgumentException(CapturedException):
"""
Passed an illegal or inappropriate argument.
"""
Expand All @@ -36,10 +45,12 @@ def deco(*a, **kw):
return f(*a, **kw)
except py4j.protocol.Py4JJavaError as e:
s = e.java_exception.toString()
stackTrace = '\n\t at '.join(map(lambda x: x.toString(),
e.java_exception.getStackTrace()))
if s.startswith('org.apache.spark.sql.AnalysisException: '):
raise AnalysisException(s.split(': ', 1)[1])
raise AnalysisException(s.split(': ', 1)[1], stackTrace)
if s.startswith('java.lang.IllegalArgumentException: '):
raise IllegalArgumentException(s.split(': ', 1)[1])
raise IllegalArgumentException(s.split(': ', 1)[1], stackTrace)
raise
return deco

Expand Down

0 comments on commit 3dfa4ea

Please sign in to comment.