Repository: incubator-systemml Updated Branches: refs/heads/master 8c3f97276 -> c27e74547
Better error messages in case of parse errors. Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/c27e7454 Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/c27e7454 Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/c27e7454 Branch: refs/heads/master Commit: c27e74547b954a413002e75bd90b6f15b2ee189b Parents: 8c3f972 Author: Niketan Pansare <[email protected]> Authored: Tue Dec 8 12:57:29 2015 -0800 Committer: Niketan Pansare <[email protected]> Committed: Tue Dec 8 12:57:29 2015 -0800 ---------------------------------------------------------------------- .../sysml/parser/antlr4/DMLParserWrapper.java | 22 +++++++++++++++++--- .../sysml/parser/python/PyDMLParserWrapper.java | 22 +++++++++++++++++--- 2 files changed, 38 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/c27e7454/src/main/java/org/apache/sysml/parser/antlr4/DMLParserWrapper.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/parser/antlr4/DMLParserWrapper.java b/src/main/java/org/apache/sysml/parser/antlr4/DMLParserWrapper.java index 5aa8776..ff16c0d 100644 --- a/src/main/java/org/apache/sysml/parser/antlr4/DMLParserWrapper.java +++ b/src/main/java/org/apache/sysml/parser/antlr4/DMLParserWrapper.java @@ -26,6 +26,8 @@ import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.HashMap; import java.util.Map; @@ -38,7 +40,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; - import org.apache.sysml.api.DMLScript; import org.apache.sysml.conf.ConfigurationManager; import org.apache.sysml.parser.AParserWrapper; @@ -229,7 +230,7 @@ public class DMLParserWrapper extends AParserWrapper } } catch(Exception e) { - throw new ParseException("ERROR: Cannot parse the program:" + fileName); + throw getParseException(e, "ERROR: Cannot parse the program:" + fileName); } @@ -249,11 +250,26 @@ public class DMLParserWrapper extends AParserWrapper dmlPgm = createDMLProgram(ast); } catch(Exception e) { - throw new ParseException("ERROR: Cannot translate the parse tree into DMLProgram:" + e.getMessage()); + throw getParseException(e, "ERROR: Cannot translate the parse tree into DMLProgram"); } return dmlPgm; } + + // Alternative is to uncomment the try/catch. But this method is preferred as it allows throwing "ParseException" as + // well as providing a given message (such as "Cannot translate the parse tree"). + private ParseException getParseException(Exception e, String message) { + String stackTrace = null; + try { + PrintWriter printWriter = new PrintWriter(new StringWriter()); + e.printStackTrace(printWriter); + stackTrace = printWriter.toString(); + } catch(Exception e1) {} + if(stackTrace != null) + return new ParseException(message + ":\n" + stackTrace); + else + return new ParseException(message); + } private DMLProgram createDMLProgram(DmlprogramContext ast) { http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/c27e7454/src/main/java/org/apache/sysml/parser/python/PyDMLParserWrapper.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/parser/python/PyDMLParserWrapper.java b/src/main/java/org/apache/sysml/parser/python/PyDMLParserWrapper.java index cbed5a4..72a9f0a 100644 --- a/src/main/java/org/apache/sysml/parser/python/PyDMLParserWrapper.java +++ b/src/main/java/org/apache/sysml/parser/python/PyDMLParserWrapper.java @@ -23,6 +23,8 @@ import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.HashMap; import java.util.Map; @@ -36,7 +38,6 @@ import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeWalker; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.apache.sysml.api.DMLScript; import org.apache.sysml.parser.AParserWrapper; import org.apache.sysml.parser.DMLProgram; @@ -204,7 +205,7 @@ public class PyDMLParserWrapper extends AParserWrapper } } catch(Exception e) { - throw new ParseException("ERROR: Cannot parse the program:" + fileName); + throw getParseException(e, "ERROR: Cannot parse the program:" + fileName); } @@ -224,11 +225,26 @@ public class PyDMLParserWrapper extends AParserWrapper dmlPgm = createDMLProgram(ast); } catch(Exception e) { - throw new ParseException("ERROR: Cannot translate the parse tree into DMLProgram:" + e.getMessage()); + throw getParseException(e, "ERROR: Cannot translate the parse tree into DMLProgram"); } return dmlPgm; } + + // Alternative is to uncomment the try/catch. But this method is preferred as it allows throwing "ParseException" as + // well as providing a given message (such as "Cannot translate the parse tree"). + private ParseException getParseException(Exception e, String message) { + String stackTrace = null; + try { + PrintWriter printWriter = new PrintWriter(new StringWriter()); + e.printStackTrace(printWriter); + stackTrace = printWriter.toString(); + } catch(Exception e1) {} + if(stackTrace != null) + return new ParseException(message + ":\n" + stackTrace); + else + return new ParseException(message); + } private DMLProgram createDMLProgram(PmlprogramContext ast) {
