Improve decoration design-pattern model of exceptions

This commit is contained in:
2020-03-15 18:33:06 +01:00
parent 2c1bae2974
commit 61e7793f24
5 changed files with 34 additions and 8 deletions

View File

@@ -3,6 +3,5 @@ package io.smnp.error
import io.smnp.environment.Environment import io.smnp.environment.Environment
class EnvironmentException(exception: SmnpException, val environment: Environment) : SmnpException( class EnvironmentException(exception: SmnpException, val environment: Environment) : SmnpException(
exception.friendlyName, exception.friendlyName, exception.message, exception
"${exception.message}\n\nStack trace:\n${environment.stackTrace()}"
) )

View File

@@ -1,3 +1,12 @@
package io.smnp.error package io.smnp.error
abstract class SmnpException(val friendlyName: String, message: String? = null) : Exception(message) abstract class SmnpException(val friendlyName: String, message: String? = null, val exception: SmnpException? = null) : Exception(message) {
val exceptionChain: List<SmnpException>
get() {
if(exception == null) {
return emptyList()
}
return listOf(this, *exception.exceptionChain.toTypedArray())
}
}

View File

@@ -5,6 +5,8 @@ import com.xenomachina.argparser.mainBody
import io.smnp.cli.model.entity.Arguments import io.smnp.cli.model.entity.Arguments
import io.smnp.cli.model.enumeration.ModulesPrintMode import io.smnp.cli.model.enumeration.ModulesPrintMode
import io.smnp.environment.DefaultEnvironment import io.smnp.environment.DefaultEnvironment
import io.smnp.error.EnvironmentException
import io.smnp.error.PositionException
import io.smnp.error.SmnpException import io.smnp.error.SmnpException
import io.smnp.ext.DefaultModuleRegistry import io.smnp.ext.DefaultModuleRegistry
import io.smnp.interpreter.DefaultInterpreter import io.smnp.interpreter.DefaultInterpreter
@@ -41,8 +43,13 @@ fun main(args: Array<String>): Unit = mainBody {
DefaultModuleRegistry.registeredModules().forEach { println(it) } DefaultModuleRegistry.registeredModules().forEach { println(it) }
} }
} catch (e: SmnpException) { } catch (e: SmnpException) {
System.err.println(e.friendlyName) val position = e.exceptionChain.mapNotNull { it as? PositionException }.lastOrNull()?.position ?: ""
val stacktrace = e.exceptionChain.mapNotNull { it as? EnvironmentException }.lastOrNull()?.let {
"\nStack trace:\n${it.environment.stackTrace()}"
} ?: ""
System.err.println(e.friendlyName + " " + position)
System.err.println(e.message) System.err.println(e.message)
System.err.println(stacktrace)
exitProcess(1) exitProcess(1)
} }
} }

View File

@@ -3,6 +3,5 @@ package io.smnp.error
import io.smnp.dsl.token.model.entity.TokenPosition import io.smnp.dsl.token.model.entity.TokenPosition
class PositionException(exception: SmnpException, val position: TokenPosition) : SmnpException( class PositionException(exception: SmnpException, val position: TokenPosition) : SmnpException(
"${exception.friendlyName} $position", exception.friendlyName, exception.message, exception
exception.message
) )

View File

@@ -24,7 +24,13 @@ class DefaultInterpreter : Interpreter {
return run(lines, environment, printTokens, printAst, dryRun) return run(lines, environment, printTokens, printAst, dryRun)
} }
private fun run(lines: List<String>, environment: Environment, printTokens: Boolean, printAst: Boolean, dryRun: Boolean): Environment { private fun run(
lines: List<String>,
environment: Environment,
printTokens: Boolean,
printAst: Boolean,
dryRun: Boolean
): Environment {
environment.loadModule("smnp.lang") environment.loadModule("smnp.lang")
val tokens = tokenizer.tokenize(lines) val tokens = tokenizer.tokenize(lines)
@@ -44,7 +50,13 @@ class DefaultInterpreter : Interpreter {
return environment return environment
} }
fun run(file: File, environment: Environment = DefaultEnvironment(), printTokens: Boolean = false, printAst: Boolean = false, dryRun: Boolean = false): Environment { fun run(
file: File,
environment: Environment = DefaultEnvironment(),
printTokens: Boolean = false,
printAst: Boolean = false,
dryRun: Boolean = false
): Environment {
val lines = file.readLines() val lines = file.readLines()
return run(lines, environment, printTokens, printAst, dryRun) return run(lines, environment, printTokens, printAst, dryRun)
} }