Return remaining args after error occurred
diff --git a/assert_test.go b/assert_test.go
index 2b31e38..14949be 100644
--- a/assert_test.go
+++ b/assert_test.go
@@ -73,9 +73,10 @@
 	}
 }
 
-func assertParseFail(t *testing.T, typ ErrorType, msg string, data interface{}, args ...string) {
+func assertParseFail(t *testing.T, typ ErrorType, msg string, data interface{}, args ...string) []string {
 	parser := NewParser(data, Default&^PrintErrors)
-	_, err := parser.ParseArgs(args)
+	ret, err := parser.ParseArgs(args)
 
 	assertError(t, err, typ, msg)
+	return ret
 }
diff --git a/command_test.go b/command_test.go
index 1e28be4..aa3a10e 100644
--- a/command_test.go
+++ b/command_test.go
@@ -162,7 +162,9 @@
 		} `command:"add"`
 	}{}
 
-	assertParseFail(t, ErrUnknownCommand, "Unknown command `addd', did you mean `add'?", &opts, "-v", "addd")
+	args := assertParseFail(t, ErrUnknownCommand, "Unknown command `addd', did you mean `add'?", &opts, "-v", "addd")
+
+	assertStringArray(t, args, []string{"addd"})
 }
 
 func TestCommandAdd(t *testing.T) {
diff --git a/parser.go b/parser.go
index 1a9303c..f542393 100644
--- a/parser.go
+++ b/parser.go
@@ -198,14 +198,18 @@
 		s.checkRequired()
 	}
 
+	var reterr error
+
 	if s.err != nil {
-		return s.retargs, p.printError(s.err)
+		reterr = p.printError(s.err)
+	} else if len(s.command.commands) != 0 && !s.command.SubcommandsOptional {
+		reterr = p.printError(s.estimateCommand())
+	} else if cmd, ok := s.command.data.(Commander); ok {
+		reterr = p.printError(cmd.Execute(s.retargs))
 	}
 
-	if len(s.command.commands) != 0 && !s.command.SubcommandsOptional {
-		return s.retargs, p.printError(s.estimateCommand())
-	} else if cmd, ok := s.command.data.(Commander); ok {
-		return s.retargs, p.printError(cmd.Execute(s.retargs))
+	if reterr != nil {
+		return append([]string{s.arg}, s.args...), reterr
 	}
 
 	return s.retargs, nil