Exceptions and Defensive Coding
Require-Style Checks
Check a precondition and return a clear rejection result.
precondition
A precondition check keeps invalid data out of the main calculation.
Require-Style Checks
RequireChecks.kt
Replay: real traced execution (multi-file project)
fun labelAmount(amount: Int): String {
if (amount <= 0) {
return "rejected"
}
return "amount:$amount"
}
fun main() {
val amount = 3
val label = labelAmount(amount)
println("amount=$amount")
println("label=$label")
}
fun labelAmount(amount: Int): String {
if (amount <= 0) {
return "rejected"
}
return "amount:$amount"
}
fun main() {
val amount = 0
val label = labelAmount(amount)
println("amount=$amount")
println("label=$label")
}
fun labelAmount(amount: Int): String {
if (amount <= 0) {
return "rejected"
}
return "amount:$amount"
}
fun main() {
val amount = 8
val label = labelAmount(amount)
println("amount=$amount")
println("label=$label")
}
amount ← 3
8fun main() {9 val amount→ 3 = 3 //@amount=0, 810 val label = labelAmount(amount3)fun labelAmount(amount: Int): String
1fun labelAmount(amount3: Int): String {2 if (amount <= 0) {3 return "rejected"4 }5 return "amount:$amount3"6}label ← amount:3
9 val amount = 3 //@amount=0, 810 val label→ amount:3 = labelAmount(amount3)1112 println("amount=$amount3")13 println("label=$labelamount:3")14}outputamount=3 label=amount:3
amount ← 0
8fun main() {9 val amount→ 0 = 010 val label = labelAmount(amount0)fun labelAmount(amount: Int): String
1fun labelAmount(amount0: Int): String {2 if (amount <= 0) {if (amount <= 0)
1fun labelAmount(amount: Int): String {2 if (amount0 <= 0) {3 return "rejected"4 }label ← rejected
9 val amount = 010 val label→ rejected = labelAmount(amount0)1112 println("amount=$amount0")13 println("label=$labelrejected")14}outputamount=0 label=rejected
amount ← 8
8fun main() {9 val amount→ 8 = 810 val label = labelAmount(amount8)fun labelAmount(amount: Int): String
1fun labelAmount(amount8: Int): String {2 if (amount <= 0) {3 return "rejected"4 }5 return "amount:$amount8"6}label ← amount:8
9 val amount = 810 val label→ amount:8 = labelAmount(amount8)1112 println("amount=$amount8")13 println("label=$labelamount:8")14}outputamount=8 label=amount:8