Ensure runtime exceptions are caught when evaluating predicates.

An exception raised by a predicate solver must not break evaluation.
This commit is contained in:
Fedor Isakov 2020-11-06 09:08:34 +01:00
parent 59f653aeee
commit b51d8257ba
2 changed files with 14 additions and 10 deletions

View File

@ -301,8 +301,12 @@ internal class ControllerImpl (
try {
this.status = block.invoke(status)
} catch (ex: EvaluationFailureException) {
this.status = status.fail(EvaluationFailure(ex))
} catch (ex: RuntimeException) {
val failure = if (ex is EvaluationFailureException)
EvaluationFailure(ex)
else
EvaluationFailure(EvaluationFailureException(ex))
this.status = status.fail(failure)
}
}
return status.operational
@ -313,11 +317,14 @@ internal class ControllerImpl (
try {
block()
} catch (ex: EvaluationFailureException) {
val failure = EvaluationFailure(ex)
} catch (ex: RuntimeException) {
val failure = if (ex is EvaluationFailureException)
EvaluationFailure(ex)
else
EvaluationFailure(EvaluationFailureException(ex))
if (checking) {
this.status = status.abort(failure)
} else {
trace.feedback(failure)
this.status = status.fail(failure)

View File

@ -3,10 +3,7 @@ import jetbrains.mps.logic.reactor.core.Occurrence
import jetbrains.mps.logic.reactor.core.ReactorLifecycle
import jetbrains.mps.logic.reactor.core.RulesDiff
import jetbrains.mps.logic.reactor.core.internal.MatchJournal
import jetbrains.mps.logic.reactor.evaluation.SessionToken
import jetbrains.mps.logic.reactor.evaluation.EvaluationResult
import jetbrains.mps.logic.reactor.evaluation.EvaluationSession
import jetbrains.mps.logic.reactor.evaluation.PredicateInvocation
import jetbrains.mps.logic.reactor.evaluation.*
import jetbrains.mps.logic.reactor.program.Constraint
import jetbrains.mps.logic.reactor.program.ConstraintSymbol
import jetbrains.mps.logic.reactor.program.IncrementalContractViolationException
@ -1544,7 +1541,7 @@ class TestIncrementalProgram {
}
}
@Test(expected = IncrementalContractViolationException::class)
@Test(expected = EvaluationFailureException::class)
fun violatePrincipalLogicalContract() {
val progSpec = MockIncrProgSpec(
setOf("main", "produceBound"),