diff --git a/pykat/exceptions.py b/pykat/exceptions.py
index 1382809d9777529702e0030a1e9e78e30eba5fce..972496951eafdf4c5c0176aaee17dad951980168 100644
--- a/pykat/exceptions.py
+++ b/pykat/exceptions.py
@@ -6,14 +6,30 @@ from __future__ import unicode_literals
 import pykat.external.six as six
 if six.PY2:
 	import exceptions
-import os
+import os, sys
+
+def PrintError(message, exception):
+    size = 60
+    
+    print("\033[91m")
+    
+    try:
+        from textwrap import wrap, fill
+        print ("-" * size)
+        for a in wrap(message, size): print(a)
+        for a in wrap(str(exception.msg), size): print(a)
+        print ("-" * size)
+    finally:
+        print ("\033[0m")
+        sys.exit(1)
+    
 
 class BasePyKatException(Exception):
     def __init__(self, msg):
-        self.__msg = msg
+        self.msg = msg
         
     def __str__(self):
-        return self.__msg
+        return self.msg
 
 class FinesseParse(BasePyKatException) :    
     def __init__(self, msg):
diff --git a/pykat/finesse.py b/pykat/finesse.py
index f1e3e9ba512d1406c9f8d5f4c61976b873090bae..06ae59eaf3eab1688a516513abe37923f222a946 100644
--- a/pykat/finesse.py
+++ b/pykat/finesse.py
@@ -603,49 +603,49 @@ class kat(object):
         return commands_new
         
     def parseCommands(self, commands, blocks=None):
-        blockComment = False
+        try:
+            blockComment = False
         
-        commands=self.remove_comments(commands)
+            commands=self.remove_comments(commands)
         
-        commands=self.processConstants(commands)
+            commands=self.processConstants(commands)
         
-        after_process = [] # list of commands that should be processed after 
-                           # objects have been set and created
+            after_process = [] # list of commands that should be processed after 
+                               # objects have been set and created
         
-        for line in commands:
-            try:
+            for line in commands:
                 if len(line.strip()) >= 2:
                     line = line.strip()
 
                     # Looking for block start or end
                     values = line.split()
-                
+            
                     if values[0] == "%%%":
                         if values[1] == "FTblock":
                             newTag = values[2]
-                        
+                    
                             if self.__currentTag != None and self.__currentTag != NO_BLOCK: 
                                 warnings.warn("found block {0} before block {1} ended".format(newTag, self.__currentTag))    
-                            
+                        
                             if newTag in self.__blocks:
                                 raise pkex.BasePyKatException("Block `{0}` has already been read".format(newTag))
-                            
+                        
                             self.__blocks[newTag] = Block(newTag) # create new list to store all references to components in block
                             self.__currentTag = newTag
-                        
+                    
                         if values[1] == "FTend":
                             self.__currentTag = NO_BLOCK
-                        
+                    
                         continue
 
                     # only include listed blocks, if we have specfied them
                     if blocks != None and self.__currentTag not in blocks:
                         continue
-                    
+                
                     # don't read comment lines
                     if line[0] == "#" or line[0] == "%":
                         continue
-                
+            
                     # check if block comment is being used
                     if not blockComment and line[0:2] == "/*":
                         blockComment = True
@@ -653,10 +653,10 @@ class kat(object):
                     elif blockComment and line[0:2] == "*/":
                         blockComment = False
                         continue
-                
+            
                     first = line.split(" ",1)[0]
                     obj = None
-                    
+                
                     if(first == "m" or first == "m1" or first == "m2"):
                         obj = pykat.components.mirror.parseFinesseText(line)
                     elif(first == "s"):
@@ -710,7 +710,7 @@ class kat(object):
                         self.lambda0 = SIfloat(v[-1])
                     elif(first == "yaxis"):
                         v = line.split()
-                    
+                
                         self.yaxis = v[-1]
                     elif(first == "phase"):
                         v = line.split()
@@ -756,134 +756,134 @@ class kat(object):
                     else:
                         if self.verbose:
                             print ("Parsing `{0}` into pykat object not implemented yet, added as extra line.".format(line))
-                        
+                    
                         obj = line
                         # manually add the line to the block contents
                         self.__blocks[self.__currentTag].contents.append(line) 
-                
+            
                     if obj != None and not isinstance(obj, six.string_types):
                         if self.hasNamedObject(obj.name):
                             getattr(self, obj.name).remove()
                             print ("Removed existing object '{0}' of type {1} to add line '{2}'".format(obj.name, obj.__class__, line))
-                        
+                    
                         self.add(obj)
-            except:
-                print ("--------------------------------------------------------")
-                print ("Error parsing line: " + line)
-                print ("--------------------------------------------------------")
-                raise
                 
                 
-        # now process all the varous gauss/attr etc. commands which require
-        # components to exist first before they can be processed
-        for line in after_process:
-            first = line.split(" ",1)[0]            
-            if first == "gauss" or first == "gauss*" or first == "gauss**":
-                pykat.commands.gauss.parseFinesseText(line, self)
-            elif (first == "scale"):
-                v = line.split()
-                accepted = ["psd","psd_hf","asd","asd_hf","meter", "ampere", "degs"]
+            # now process all the varous gauss/attr etc. commands which require
+            # components to exist first before they can be processed
+            for line in after_process:
+                first = line.split(" ",1)[0]            
+                if first == "gauss" or first == "gauss*" or first == "gauss**":
+                    pykat.commands.gauss.parseFinesseText(line, self)
+                elif (first == "scale"):
+                    v = line.split()
+                    accepted = ["psd","psd_hf","asd","asd_hf","meter", "ampere", "degs"]
                 
-                if len(v) == 3:
-                    component_name = v[2]
+                    if len(v) == 3:
+                        component_name = v[2]
                     
-                    if v[1].lower() in accepted:
-                        val = v[1]
-                    else:
-                        try:
-                            val = SIfloat(v[1])
-                        except ValueError as ex:
-                            raise pkex.BasePyKatException("Line `{0}`:\nAccepted scale values are decimal numbers or %s." % (line,str(accepted)))
+                        if v[1].lower() in accepted:
+                            val = v[1]
+                        else:
+                            try:
+                                val = SIfloat(v[1])
+                            except ValueError as ex:
+                                raise pkex.BasePyKatException("Line `{0}`:\nAccepted scale values are decimal numbers or %s." % (line,str(accepted)))
                             
-                    if component_name in self.__detectors :
-                        self.__detectors[component_name].scale.append(val)
-                    else:
-                        raise pkex.BasePyKatException("scale command `{0}` refers to non-existing output".format(component_name))
-                elif len(v) == 2:
-                    if v[1] == "meter" or v[1] == "ampere" or v[1] == "deg":
-                        self.scale = v[1]
+                        if component_name in self.__detectors :
+                            self.__detectors[component_name].scale.append(val)
+                        else:
+                            raise pkex.BasePyKatException("scale command `{0}` refers to non-existing output".format(component_name))
+                    elif len(v) == 2:
+                        if v[1] == "meter" or v[1] == "ampere" or v[1] == "deg":
+                            self.scale = v[1]
+                        else:
+                            self.scale = SIfloat(v[1])
                     else:
-                        self.scale = SIfloat(v[1])
-                else:
-                    raise pkex.BasePyKatException("scale command `{0}` is incorrect.".format(line))
-            elif (first == "pdtype"):
-                v = line.split()
-                if len(v) == 3:
-                    component_name = v[1]
-                    if component_name in self.__detectors :
-                        self.__detectors[component_name].pdtype = v[2]
+                        raise pkex.BasePyKatException("scale command `{0}` is incorrect.".format(line))
+                elif (first == "pdtype"):
+                    v = line.split()
+                    if len(v) == 3:
+                        component_name = v[1]
+                        if component_name in self.__detectors :
+                            self.__detectors[component_name].pdtype = v[2]
+                        else:
+                            raise pkex.BasePyKatException("pdtype command `{0}` refers to non-existing detector".format(component_name))
                     else:
-                        raise pkex.BasePyKatException("pdtype command `{0}` refers to non-existing detector".format(component_name))
-                else:
-                    raise pkex.BasePyKatException("pdtype command `{0}` is incorrect.".format(line))
-            elif(first == "attr"):
-                v = line.split()
+                        raise pkex.BasePyKatException("pdtype command `{0}` is incorrect.".format(line))
+                elif(first == "attr"):
+                    v = line.split()
 
-                if len(v) < 4:
-                    raise pkex.BasePyKatException("attr command `{0}` is incorrect.".format(line))
-                else:
-                    # get the component/detector in question
-                    if v[1] in self.__components:
-                        comp = self.__components[v[1]]
-                    elif v[1] in self.__detectors:
-                        comp = self.__detectors[v[1]]
+                    if len(v) < 4:
+                        raise pkex.BasePyKatException("attr command `{0}` is incorrect.".format(line))
                     else:
-                        raise pkex.BasePyKatException("Could not find the component '{0}' for attr command in line '{1}'".format(v[1], line))
+                        # get the component/detector in question
+                        if v[1] in self.__components:
+                            comp = self.__components[v[1]]
+                        elif v[1] in self.__detectors:
+                            comp = self.__detectors[v[1]]
+                        else:
+                            raise pkex.BasePyKatException("Could not find the component '{0}' for attr command in line '{1}'".format(v[1], line))
                 
-                    if len(v[2:]) % 2 == 1:
-                        raise pkex.BasePyKatException("Attr command '{0}' must specify both parameter and value pairs".format(line))
+                        if len(v[2:]) % 2 == 1:
+                            raise pkex.BasePyKatException("Attr command '{0}' must specify both parameter and value pairs".format(line))
                                                 
-                    # convert split list to key value pairs
-                    #kv = dict(itertools.izip_longest(*[iter(v[2:])] * 2, fillvalue=None))
-                    kv = dict(izip_longest(*[iter(v[2:])] * 2, fillvalue=None))
+                        # convert split list to key value pairs
+                        #kv = dict(itertools.izip_longest(*[iter(v[2:])] * 2, fillvalue=None))
+                        kv = dict(izip_longest(*[iter(v[2:])] * 2, fillvalue=None))
 
-                    comp.parseAttributes(kv)
+                        comp.parseAttributes(kv)
                     
-            elif(first == "fsig"):
+                elif(first == "fsig"):
                 
-                v = line.split()
+                    v = line.split()
                 
-                name = str(v[1])
+                    name = str(v[1])
                 
-                if v[2] not in self.__components:
-                    raise pkex.BasePyKatException("Could not find the component '{0}'. Line: '{1}'".format(v[2], line))
+                    if v[2] not in self.__components:
+                        raise pkex.BasePyKatException("Could not find the component '{0}'. Line: '{1}'".format(v[2], line))
                 
-                comp = self.__components[v[2]]
+                    comp = self.__components[v[2]]
                 
-                if comp._default_fsig() == None:
-                    raise pkex.BasePyKatException("Component '{0}' cannot be fsig'd. Line: '{1}'".format(comp.name, line))
+                    if comp._default_fsig() == None:
+                        raise pkex.BasePyKatException("Component '{0}' cannot be fsig'd. Line: '{1}'".format(comp.name, line))
                     
-                param = None
-                amp = None
+                    param = None
+                    amp = None
                 
-                if len(v) == 5:
-                    param == None
-                    freq = float(v[3])
-                    phase = float(v[4])
-                elif len(v) == 6:
-                    if v[3].isdigit():
+                    if len(v) == 5:
+                        param == None
                         freq = float(v[3])
                         phase = float(v[4])
-                        amp = float(v[5])
-                    else:
+                    elif len(v) == 6:
+                        if v[3].isdigit():
+                            freq = float(v[3])
+                            phase = float(v[4])
+                            amp = float(v[5])
+                        else:
+                            param = v[3]
+                            freq = float(v[4])
+                            phase = float(v[5])
+                    elif len(v) == 7:
                         param = v[3]
                         freq = float(v[4])
                         phase = float(v[5])
-                elif len(v) == 7:
-                    param = v[3]
-                    freq = float(v[4])
-                    phase = float(v[5])
-                    amp = float(v[6])
-                else:
-                    raise pkex.BasePyKatException("'{0}' isnot a valid fsig command".format(line))
+                        amp = float(v[6])
+                    else:
+                        raise pkex.BasePyKatException("'{0}' isnot a valid fsig command".format(line))
                 
-                self.signals.apply(comp._default_fsig(), amp, phase, name)
+                    self.signals.apply(comp._default_fsig(), amp, phase, name)
                 
-            else:
-                raise pkex.BasePyKatException("Haven't handled parsing of '{0}'".format(line))
+                else:
+                    raise pkex.BasePyKatException("Haven't handled parsing of '{0}'".format(line))
                     
-        self.__currentTag = NO_BLOCK 
+            self.__currentTag = NO_BLOCK 
         
+
+        except pkex.BasePyKatException as ex:
+            pkex.PrintError("Error parsing line: '%s':"%  line, ex)
+            sys.exit(1)
+            
     def saveScript(self, filename=None):
         """
         Saves the current kat object to a Finesse input file
@@ -1031,23 +1031,17 @@ class kat(object):
                             if six.PY2:
                                 sys.stdout.write(line)        
                             else:
-                                sys.stdout.write(str(line,'utf-8')) 
+                                sys.stdout.write(line) # todo fix this if needed        
                     elif line.rstrip().endswith(b'%'):
                         vals = line.split("-")
                         action = vals[0].strip()
                         prc = vals[1].strip()[:]
                         
                         if printerr == 1:
-                            if six.PY2:
-                                sys.stdout.write("\r{0} {1}".format(action, prc))
-                            else:
-                                sys.stdout.write("\r{0} {1}".format(str(action, 'utf-8'), str(prc, 'utf-8')))
+                            sys.stdout.write("\r{0} {1}".format(action, str(prc)))
                             
                     else:
-                        if six.PY2:
-                            err="".join((err,line))
-                        else:
-                            err="".join((err,str(line, 'utf-8')))
+                        err += str(line)
 
             
             [out,errpipe] = p.communicate()