Browse Source

NotImplementedException; ArgumentException

Aleksandr Kuzmenko 5 years ago
parent
commit
8d017da610

+ 16 - 0
std/haxe/exceptions/ArgumentException.hx

@@ -0,0 +1,16 @@
+package haxe.exceptions;
+
+/**
+	An exception that is thrown when an invalid value provided for an argument of a function.
+**/
+class ArgumentException extends PosException {
+	/**
+		An argument name.
+	**/
+	public final argument:String;
+
+	public function new(argument:String, ?message:String, ?previous:Exception, ?pos:PosInfos):Void {
+		super(message == null ? 'Invalid argument "$argument"' : message, previous, pos);
+		this.argument = argument;
+	}
+}

+ 10 - 0
std/haxe/exceptions/NotImplementedException.hx

@@ -0,0 +1,10 @@
+package haxe.exceptions;
+
+/**
+	An exception that is thrown when requested function or operation does not have an implementation.
+**/
+class NotImplementedException extends PosException {
+	public function new(message:String = 'Not implemented', ?previous:Exception, ?pos:PosInfos):Void {
+		super(message, previous, pos);
+	}
+}

+ 27 - 0
std/haxe/exceptions/PosException.hx

@@ -0,0 +1,27 @@
+package haxe.exceptions;
+
+/**
+	An exception that carry position information of a place where it was created.
+**/
+class PosException extends Exception {
+	/**
+		Position where this exception was created.
+	**/
+	public final posInfos:PosInfos;
+
+	public function new(message:String, ?previous:Exception, ?pos:PosInfos):Void {
+		super(message, previous);
+		if (pos == null) {
+			posInfos = { fileName:'(unknown)', lineNumber:0, className:'(unknown)', methodName:'(unknown)' }
+		} else {
+			posInfos = pos;
+		}
+	}
+
+	/**
+		Returns exception message.
+	**/
+	override function toString():String {
+		return '${super.toString()} in ${posInfos.className}.${posInfos.methodName} at ${posInfos.fileName}:${posInfos.lineNumber}';
+	}
+}

+ 25 - 0
tests/unit/src/unit/TestExceptions.hx

@@ -1,6 +1,8 @@
 package unit;
 
 import haxe.Exception;
+import haxe.exceptions.ArgumentException;
+import haxe.exceptions.NotImplementedException;
 import haxe.ValueException;
 import haxe.CallStack;
 import utest.Assert;
@@ -315,6 +317,29 @@ class TestExceptions extends Test {
 		eq('haxe.Exception', HelperMacros.typeString(try throw new Exception('') catch(e) e));
 	}
 
+	function testNotImplemented() {
+		try {
+			futureFeature();
+		} catch(e:NotImplementedException) {
+			eq('unit.TestExceptions', e.posInfos.className);
+			eq('futureFeature', e.posInfos.methodName);
+		}
+	}
+	function futureFeature() {
+		throw new NotImplementedException();
+	}
+
+	function testArgumentException() {
+		function negativeOnly(i:Int) {
+			if(i >= 0) throw new ArgumentException('i');
+		}
+		try {
+			negativeOnly(10);
+		} catch(e:ArgumentException) {
+			eq('i', e.argument);
+		}
+	}
+
 #if java
 	function testCatchChain() {
 		eq("caught NativeExceptionChild: msg", raise(() -> throw new NativeExceptionChild("msg")));