in Blocks Versus enforce Checks
This lesson teaches you when to use assert checks with in-blocks versus enforce checks inside function bodies.
We'll cover the following
Use in
blocks or enforce
? #
We have seen in the assert and enforce chapter that sometimes it is difficult to decide whether to use assert
or enforce
checks. Similarly, sometimes it is difficult to decide whether to use assert
checks within in
blocks versus enforce
checks within function bodies.
The fact that it is possible to disable contract programming is an indication that contract programming is for protecting against programmer errors. For that reason, the decision here should be based on the same guidelines that we saw in the assert
and enforce
chapter:
-
If the check is guarding against a coding error, then it should be in the
in
block. For example, if the function is called only from other parts of the program, likely to help with achieving a functionality of it, then the parameter values are entirely the responsibility of the programmer. For that reason, the preconditions of such a function should be checked in itsin
block. -
If the function cannot achieve some task for any other reason, including invalid parameter values, then it must throw an exception, conveniently by
enforce
.
Example #
To see an example of this, let’s define a function that returns a slice of a certain width from the middle of another slice. Let’s assume that this function is for the consumption of the users of the module, as opposed to being an internal function used by the module itself. Since the users of this module can call this function by various and potentially invalid parameter values, it would be appropriate to check the parameter values every time the function is called. It would be insufficient to only check them at program development time, after which contracts can be disabled by ‐release.
Another criterion to consider when deciding between in
blocks versus enforce
is to consider whether the condition is recoverable. If it is recoverable by the higher layers of code, then it may be more appropriate to throw an exception, conveniently by enforce
.
The following function validates its parameters by calling enforce
in the function body instead of an assert
check in the in
block:
Get hands-on with 1400+ tech skills courses.