Adding error handling support
This commit is contained in:
		| @ -1,5 +1,7 @@ | ||||
| import sys | ||||
|  | ||||
| from modules.errors import SPFUnknownVariable, SPFUninitializedVariable, SPFAlreadyDefined, SPFIncompatibleType, SPFIndexError | ||||
|  | ||||
| trace_format = '\033[1m -> ' | ||||
| reset_format = '\033[0m' | ||||
|  | ||||
| @ -11,14 +13,16 @@ class Variables: | ||||
|                   "booléen": bool, | ||||
|                   "liste": list } | ||||
|  | ||||
|         def __init__(self, typ, value = None): | ||||
|         def __init__(self, typ, value=None): | ||||
|             assert typ in self.types.keys(), "Ce type de variable est inconnu" | ||||
|             self.type = typ | ||||
|             assert self.checkType(value, typ), f"Le type n'est pas équivalent: { value } n'est pas {typ}" | ||||
|             self.value = value if (value is not None) else self.default(typ) | ||||
|             if not self.checkType(value, typ): | ||||
|                 raise SPFIncompatibleType(value, self.type) | ||||
|             self.value = value | ||||
|  | ||||
|         def set(self, value): | ||||
|             assert self.checkType(value, self.type), f"Le type n'est pas équivalent: {value} n'est pas {self.type}" | ||||
|             if not self.checkType(value, self.type): | ||||
|                 raise SPFIncompatibleType(value, self.type) | ||||
|             self.value = value | ||||
|  | ||||
|         def __str__(self): | ||||
| @ -49,19 +53,24 @@ class Variables: | ||||
|         self.trace = trace | ||||
|  | ||||
|     def get(self, name): | ||||
|         assert name in self.variables, f"la variable {name} n'éxiste pas" | ||||
|         if name not in self.variables: | ||||
|             raise SPFUnknownVariable(name) | ||||
|         if self.variables[name].value == None: | ||||
|             raise SPFUninitializedVariable(name) | ||||
|         if self.trace: | ||||
|             print(f"{trace_format}accède {name}{reset_format}", file=sys.stderr) | ||||
|         return self.variables[name].value | ||||
|  | ||||
|     def declare(self, typ, name, value=None): | ||||
|         assert name not in self.variables, f"la variable {name} existe déjà" | ||||
|         if name in self.variables: | ||||
|             raise SPFAlreadyDefined(name) | ||||
|         self.variables[name] = self.Variable(typ, value) | ||||
|         if self.trace: | ||||
|             print(f"{trace_format}déclare {name} = {value}{reset_format}", file=sys.stderr) | ||||
|  | ||||
|     def assign(self, name, value): | ||||
|         assert name in self.variables, f"la variable {name} n'éxiste pas" | ||||
|         if name not in self.variables: | ||||
|             raise SPFUnknownVariable(name) | ||||
|         self.variables[name].set(value) | ||||
|         if self.trace: | ||||
|             print(f"{trace_format}modifie {name} = {value}{reset_format}", file=sys.stderr) | ||||
|  | ||||
							
								
								
									
										44
									
								
								modules/errors.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								modules/errors.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | ||||
| # args | ||||
| # 0) variable name | ||||
| # 1) list of lines of the stack trace | ||||
|  | ||||
| class SPFException(Exception): | ||||
|     def __init__(self, *args): | ||||
|         super().__init__(*args) | ||||
|         self.msg = "Une erreur est survenue" | ||||
|         self.errorline = None | ||||
|  | ||||
|     def __str__(self): | ||||
|         return (f"[ligne {self.errorline}] " if self.errorline else "") + f"{self.msg}" | ||||
|  | ||||
| class SPFSyntaxError(SPFException): | ||||
|     def __init__(self, *args): | ||||
|         super().__init__(*args) | ||||
|         self.msg = "Une erreur de syntaxe est survenue" | ||||
|  | ||||
| class SPFUnknownVariable(SPFException): | ||||
|     def __init__(self, *args): | ||||
|         super().__init__(*args) | ||||
|         self.msg = f"la variable `{args[0]}` n'est pas déclarée" | ||||
|  | ||||
| class SPFUninitializedVariable(SPFException): | ||||
|     def __init__(self, *args): | ||||
|         super().__init__(*args) | ||||
|         self.msg = f"la variable `{args[0]}` n'est pas initialisée" | ||||
|  | ||||
| class SPFAlreadyDefined(SPFException): | ||||
|     def __init__(self, *args): | ||||
|         super().__init__(*args) | ||||
|         self.msg = f"la variable `{args[0]}` est déjà déclarée" | ||||
|  | ||||
| class SPFIncompatibleType(SPFException): | ||||
|     def __init__(self, *args): | ||||
|         super().__init__(*args) | ||||
|         self.msg = f"`{args[0]}` n'est pas de type `{args[1]}`" | ||||
|  | ||||
| class SPFIndexError(SPFException): | ||||
|     def __init__(self, *args): | ||||
|         super().__init__(*args) | ||||
|         self.msg = f"La liste `{args[0]}` ne posède pas d'élèment d'indexe {args[1]}" | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user