All YAML exceptions now keep track of file and line they've been

thrown at, making debugging easier.
This commit is contained in:
Ferdinand Majerech 2011-10-13 11:30:14 +02:00
parent 34b11405d4
commit 8360da733d
9 changed files with 57 additions and 36 deletions

View file

@ -32,12 +32,7 @@ package:
*/
class ComposerException : MarkedYAMLException
{
this(string context, Mark contextMark, string problem, Mark problemMark)
{
super(context, contextMark, problem, problemMark);
}
this(string problem, Mark problemMark){super(problem, problemMark);}
mixin MarkedExceptionCtors;
}
///Composes YAML documents from events provided by a Parser.

View file

@ -43,9 +43,10 @@ class ConstructorException : YAMLException
* start = Start position of the error context.
* end = End position of the error context.
*/
this(string msg, Mark start, Mark end)
this(string msg, Mark start, Mark end, string file = __FILE__, int line = __LINE__)
{
super(msg ~ "\nstart:" ~ start.toString() ~ "\nend:" ~ end.toString());
super(msg ~ "\nstart:" ~ start.toString() ~ "\nend:" ~ end.toString(),
file, line);
}
}

View file

@ -37,12 +37,15 @@ import dyaml.util;
package:
///Exception thrown at Emitter errors.
/**
* Exception thrown at Emitter errors.
*
* See_Also:
* YAMLException
*/
class EmitterException : YAMLException
{
public:
///Construct an EmitterException with specified message.
this(string msg){super(msg);}
mixin ExceptionCtors;
}
//Stores results of analysis of a scalar, determining e.g. what scalar style to use.

View file

@ -17,8 +17,11 @@ import std.string;
class YAMLException : Exception
{
public:
///Construct a YAMLException with specified message.
this(string msg){super(msg);}
///Construct a YAMLException with specified message, and position where it was thrown.
this(string msg, string file = __FILE__, int line = __LINE__)
{
super(msg, file, line);
}
package:
//Set name of the file that was being processed when this exception was thrown.
@ -59,17 +62,45 @@ package:
abstract class MarkedYAMLException : YAMLException
{
//Construct a MarkedYAMLException with specified context and problem.
this(string context, Mark contextMark, string problem, Mark problemMark)
this(string context, Mark contextMark, string problem, Mark problemMark,
string file = __FILE__, int line = __LINE__)
{
string msg = context ~ '\n';
if(contextMark != problemMark){msg ~= contextMark.toString() ~ '\n';}
msg ~= problem ~ '\n' ~ problemMark.toString() ~ '\n';
super(msg);
super(msg, file, line);
}
//Construct a MarkedYAMLException with specified problem.
this(string problem, Mark problemMark)
this(string problem, Mark problemMark, string file = __FILE__, int line = __LINE__)
{
super(problem ~ '\n' ~ problemMark.toString());
super(problem ~ '\n' ~ problemMark.toString(), file, line);
}
}
///Constructors of YAML exceptions are mostly the same, so we use a mixin.
template ExceptionCtors()
{
public:
this(string msg, string file = __FILE__, int line = __LINE__)
{
super(msg, file, line);
}
}
///Constructors of marked YAML exceptions are mostly the same, so we use a mixin.
template MarkedExceptionCtors()
{
public:
this(string context, Mark contextMark, string problem, Mark problemMark,
string file = __FILE__, int line = __LINE__)
{
super(context, contextMark, problem, problemMark,
file, line);
}
this(string problem, Mark problemMark, string file = __FILE__, int line = __LINE__)
{
super(problem, problemMark, file, line);
}
}

View file

@ -37,9 +37,9 @@ class NodeException : YAMLException
* Params: msg = Error message.
* start = Start position of the node.
*/
this(string msg, Mark start)
this(string msg, Mark start, string file = __FILE__, int line = __LINE__)
{
super(msg ~ "\nNode at:" ~ start.toString());
super(msg ~ "\nNode at:" ~ start.toString(), file, line);
}
}

View file

@ -96,12 +96,7 @@ package:
*/
class ParserException : MarkedYAMLException
{
this(string context, Mark contextMark, string problem, Mark problemMark)
{
super(context, contextMark, problem, problemMark);
}
this(string problem, Mark problemMark){super(problem, problemMark);}
mixin MarkedExceptionCtors;
}
///Generates events from tokens provided by a Scanner.

View file

@ -27,7 +27,10 @@ package:
///Exception thrown at Reader errors.
class ReaderException : YAMLException
{
this(string msg){super("Error reading YAML stream: " ~ msg);}
this(string msg, string file = __FILE__, int line = __LINE__)
{
super("Error reading YAML stream: " ~ msg, file, line);
}
}
///Reads data from a stream and converts it to UTF-32 (dchar) data.

View file

@ -30,9 +30,7 @@ import dyaml.tag;
///Exception thrown on Representer errors.
class RepresenterException : YAMLException
{
public:
///Construct an RepresenterException with specified message.
this(string msg){super(msg);}
mixin ExceptionCtors;
}
///Used to represent YAML nodes various data types into scalar/sequence/mapping nodes ready for output.

View file

@ -61,12 +61,7 @@ package:
*/
class ScannerException : MarkedYAMLException
{
this(string context, Mark contextMark, string problem, Mark problemMark)
{
super(context, contextMark, problem, problemMark);
}
this(string problem, Mark problemMark){super(problem, problemMark);}
mixin MarkedExceptionCtors;
}
///Generates tokens from data provided by a Reader.