diff --git a/exec/imapservice.js b/exec/imapservice.js
index bc5391317485422729c4fb28c5183774340de714..6e4c2a578e443f6e89156ba4b45bd7b271dbb9c3 100644
--- a/exec/imapservice.js
+++ b/exec/imapservice.js
@@ -647,130 +647,134 @@ function handle_command(command, args, defs)
 
 function parse_command(line)
 {
-	function execute_line(args) {
-		if(args.length >= 2) {
-			command=args[1].toUpperCase();
-			args.splice(1,1);
-			if(handle_command(command, args, any_state_command_handlers))
-				return;
-			switch(state) {
-				case UnAuthenticated:
-					if(handle_command(command, args, unauthenticated_command_handlers))
-						return;
-					break;
-				case Authenticated:
-					if(handle_command(command, args, authenticated_command_handlers))
-						return;
-					break;
-				case Selected:
-					if(handle_command(command, args, selected_command_handlers))
-						return;
-					if(handle_command(command, args, authenticated_command_handlers))
-						return;
-					break;
+	try {
+		function execute_line(args) {
+			if(args.length >= 2) {
+				command=args[1].toUpperCase();
+				args.splice(1,1);
+				if(handle_command(command, args, any_state_command_handlers))
+					return;
+				switch(state) {
+					case UnAuthenticated:
+						if(handle_command(command, args, unauthenticated_command_handlers))
+							return;
+						break;
+					case Authenticated:
+						if(handle_command(command, args, authenticated_command_handlers))
+							return;
+						break;
+					case Selected:
+						if(handle_command(command, args, selected_command_handlers))
+							return;
+						if(handle_command(command, args, authenticated_command_handlers))
+							return;
+						break;
+				}
 			}
+			// Ignore empty lines (Seamonkey sends these...)
+			if (args.length > 0)
+				tagged(args[0], "BAD", "Bad dog, no cookie.");
 		}
-		// Ignore empty lines (Seamonkey sends these...)
-		if (args.length > 0)
-			tagged(args[0], "BAD", "Bad dog, no cookie.");
-	}
 
-	function parse_line() {
-		var at_start=true;
-		var	in_quote=false;
-		var paren_depth=0;
-		var string_len;
-		var args=[];
-		var pos;
-
-		function parse_atom() {
-			var ret='';
-
-			while(line.length) {
-				switch(line.charAt(0)) {
-					case ')':
-						return(ret);
-					case ' ':
-						line=line.substr(1);
-						return(ret);
-					default:
-						ret += line.charAt(0);
-						line=line.substr(1);
-						break;
+		function parse_line() {
+			var at_start=true;
+			var	in_quote=false;
+			var paren_depth=0;
+			var string_len;
+			var args=[];
+			var pos;
+
+			function parse_atom() {
+				var ret='';
+
+				while(line.length) {
+					switch(line.charAt(0)) {
+						case ')':
+							return(ret);
+						case ' ':
+							line=line.substr(1);
+							return(ret);
+						default:
+							ret += line.charAt(0);
+							line=line.substr(1);
+							break;
+					}
 				}
+				return(ret);
 			}
-			return(ret);
-		}
 
-		function parse_string()
-		{
-			var ret='';
-
-			if (line.search(/^{([0-9]+)}$/) !== 0)
-				throw new Error('invalid string literal ('+line+'), aborting');
-			line=line.replace(/^{([0-9]+)}$/, "$1");
-			client.socket.send("+ Give me more of that good stuff\r\n");
-			var len = parseInt(line);
-			if(len) {
-				ret=client.socket.recv(len);
-				if (ret === null)
-					throw new Error('recv() of ' + len + ' bytes returned null');
-				if (ret.length !== len)
-					throw new Error('recv() of ' + len + ' bytes returned a string with ' + ret.length + ' instead.');
-				line=client.socket.recvline(10240, 1800);
+			function parse_string()
+			{
+				var ret='';
+
+				if (line.search(/^{([0-9]+)}$/) !== 0)
+					throw new Error('invalid string literal ('+line+'), aborting');
+				line=line.replace(/^{([0-9]+)}$/, "$1");
+				client.socket.send("+ Give me more of that good stuff\r\n");
+				var len = parseInt(line);
+				if(len) {
+					ret=client.socket.recv(len);
+					if (ret === null)
+						throw new Error('recv() of ' + len + ' bytes returned null');
+					if (ret.length !== len)
+						throw new Error('recv() of ' + len + ' bytes returned a string with ' + ret.length + ' instead.');
+					line=client.socket.recvline(10240, 1800);
+				}
+				else {
+					line = undefined;
+				}
+				return(ret);
 			}
-			else {
-				line = undefined;
+
+			function parse_quotedstring() {
+				var ret='';
+		
+				line=line.substr(1);	// Remove leading "
+				while(line.length) {
+					switch(line.charAt(0)) {
+						case '"':
+							line=line.substr(1);
+							return(ret);
+						default:
+							ret += line.charAt(0);
+							line=line.substr(1);
+							break;
+					}
+				}
+				return(ret);
 			}
-			return(ret);
-		}
 
-		function parse_quotedstring() {
-			var ret='';
-	
-			line=line.substr(1);	// Remove leading "
-			while(line.length) {
+			while(line) {
 				switch(line.charAt(0)) {
 					case '"':
+						args.push(parse_quotedstring());
+						break;
+					case ')':
 						line=line.substr(1);
-						return(ret);
-					default:
-						ret += line.charAt(0);
+						return(args);
+					case '(':
 						line=line.substr(1);
+						args.push(parse_line());
+						break;
+					case '{':
+						args.push(parse_string());
+						break;
+					case ' ':
+						line=line.substr(1);
+						break;
+					default:
+						args.push(parse_atom());
 						break;
 				}
 			}
-			return(ret);
+			return(args);
 		}
 
-		while(line) {
-			switch(line.charAt(0)) {
-				case '"':
-					args.push(parse_quotedstring());
-					break;
-				case ')':
-					line=line.substr(1);
-					return(args);
-				case '(':
-					line=line.substr(1);
-					args.push(parse_line());
-					break;
-				case '{':
-					args.push(parse_string());
-					break;
-				case ' ':
-					line=line.substr(1);
-					break;
-				default:
-					args.push(parse_atom());
-					break;
-			}
-		}
-		return(args);
+		send_updates();
+		return(execute_line(parse_line()));
+	} catch(error) {
+		log(LOG_WARNING, "Exception during command parsing: " + error);
 	}
-
-	send_updates();
-	return(execute_line(parse_line()));
 }
 
 // Command handling functions