dracoblue.net

JavaScript new Exception(name,message)

Today I noticed that JavaScript doesn't provide an easy way to make/raise custom exceptions? while still providing an useful stacktrace.

Here is a code snippet used for the

GTA:T JavaScript interface to find the fitting stacktrace for a custom JavaScript Exception.

function Exception(name,msg) {
	try {
		throw new Error("")
	} catch (e) {
		e.stack = e.stack.split("@"+e.fileName+":").join(":");
		full_stack = e.stack.split("\\n");
		stack = [];
		stack[0] = "Exception: "+name+"(\""+msg+"\")"
		for (var i=2;i<full_stack.length-3;i++) {
			entry = full_stack[i];
			entry_detailed = entry.split(":");
			entry_detailed[1] = entry_detailed[1] - 4; // THIS is to
			// mark, that we'll "move" the source 4 lines higher,
			// ... because it's eval code executed. Remove that for
			// clear values.
			if (i==2) lineNumber = entry_detailed[1];
			stack[i] = entry_detailed.join(":");
		}
		return {
			name:name,
			message:msg,
			stack:stack.join("\\n"),
			lineNumber:lineNumber
		};
	}
}

You may use it that way:

try {
    function a() {
        throw new Exception("MyException","No permission!")
    }
    function b() {
        a()
    }
    b()
} catch (e) {
    alert(e.name+": "+e.message);
}
// Tested in Firefox
/* e:
Object {
  [name] => MyException
  [message] => No permission!
  [stack] => Exception: MyException("No permission!")
             a():3
             b():6
             execute():10
  [lineNumber] => 3
}*/
In HTML, JavaScript, open source by
@ 2008-06-05, Comments at Reddit & Hackernews