public abstract class ControlFlowError extends Error
Error
thrown to regulate control flow inside multiverse TxnExecutor
. Normally
it would be a very bad thing to regulate control flow using an exception/error, but to make seamless integration in the Java
language possible, there is no better alternative. So these exceptions should not catch unless you really know know what you
are doing. So catching all Throwable instances (including Error) is a bad practice.
There current are 3 different types of ControlFlowErrors:
ReadWriteConflict
: used to indicate read and write conflictsRetryError
: used for blockingSpeculativeConfigurationError
: used for guessing the most optimal configuration for transactionsIt is an Error instead of a RuntimeException, to prevent users trying to catch the error inside a try/catch(RuntimeException) block and consuming important events like a ReadWriteConflict. In most cases these events can be solved by retrying the transaction.
It is an Error instead of a Throwable, because a Throwable needs to be propagated, so making the code a lot more awkward to work with.
Normally ControlFlowErrors are cached to be reused because they can be thrown very often to be caught by the TxnExecutor
and discarded. Especially the stacktrace is very expensive to create. By default all ControlFlowErrors are reused
but with the TxnFactoryBuilder.setControlFlowErrorsReused(boolean)
this behavior
can be changed. It also can be configured on the Stm level, depending on the Stm implementation. For the
GammaStm
you need to look at the
GammaStmConfig.controlFlowErrorsReused
.
The constructors also expose configuration options to have the StackTrace filled. Especially for an Error that is reused, not filling the stacktrace is very important because else the developer is looking at code where the exception very likely didn't happen.
Constructor and Description |
---|
ControlFlowError(boolean fillStackTrace)
Creates a new ControlFlowError.
|
ControlFlowError(boolean fillStackTrace,
String message)
Creates a new ControlFlowError with the provided message.
|
ControlFlowError(boolean fillStackTrace,
String message,
Throwable cause)
Creates a new ControlFlowError with the provided message and cause.
|
Modifier and Type | Method and Description |
---|---|
StackTraceElement[] |
getStackTrace() |
addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
public ControlFlowError(boolean fillStackTrace)
fillStackTrace
- true if the StackTrace should be filled, false otherwise.public ControlFlowError(boolean fillStackTrace, String message)
fillStackTrace
- true if the StackTrace should be filled, false otherwise.message
- the message of the exception.public ControlFlowError(boolean fillStackTrace, String message, Throwable cause)
fillStackTrace
- true if the StackTrace should be filled, false otherwise.message
- the message of the exception.cause
- the cause of the exception.public StackTraceElement[] getStackTrace()
getStackTrace
in class Throwable
Copyright © 2020. All rights reserved.