Exceptions and Defensive Coding
Custom Error Code
Use a named status value for a domain-specific failure.
custom-error
A small status type can name an application failure without exposing low-level details.
Custom Error Code
CustomErrorCode.kt
Replay: real traced execution (multi-file project)
class LevelStatus(val ok: Boolean, val label: String)
fun levelName(level: Int): LevelStatus {
if (level < 1) {
return LevelStatus(false, "level:missing")
}
return LevelStatus(true, "level:$level")
}
fun main() {
val level = 2
val status = levelName(level)
val outcome = if (status.ok) {
"ok"
} else {
"fail"
}
println("level=$level")
println("outcome=$outcome")
println("label=${status.label}")
}
class LevelStatus(val ok: Boolean, val label: String)
fun levelName(level: Int): LevelStatus {
if (level < 1) {
return LevelStatus(false, "level:missing")
}
return LevelStatus(true, "level:$level")
}
fun main() {
val level = 0
val status = levelName(level)
val outcome = if (status.ok) {
"ok"
} else {
"fail"
}
println("level=$level")
println("outcome=$outcome")
println("label=${status.label}")
}
class LevelStatus(val ok: Boolean, val label: String)
fun levelName(level: Int): LevelStatus {
if (level < 1) {
return LevelStatus(false, "level:missing")
}
return LevelStatus(true, "level:$level")
}
fun main() {
val level = 5
val status = levelName(level)
val outcome = if (status.ok) {
"ok"
} else {
"fail"
}
println("level=$level")
println("outcome=$outcome")
println("label=${status.label}")
}
level ← 2
10fun main() {11 val level→ 2 = 2 //@level=0, 512 val status = levelName(level2)13 val outcome = if (status.ok) {fun levelName(level: Int): LevelStatus
3fun levelName(level2: Int): LevelStatus {4 if (level < 1) {5 return LevelStatus(false, "level:missing")6 }7 return LevelStatus(true, "level:$level2")8}outcome ← ok
11 val level = 2 //@level=0, 512 val status = levelName(level2)13 val outcome→ ok = if (status.oktrue) {14 "ok"15 } else {16 "fail"17 }1819 println("level=$level2")20 println("outcome=$outcomeok")21 println("label=${status.labellevel:2}")22}outputlevel=2 outcome=ok label=level:2
level ← 0
10fun main() {11 val level→ 0 = 012 val status = levelName(level0)13 val outcome = if (status.ok) {fun levelName(level: Int): LevelStatus
3fun levelName(level0: Int): LevelStatus {4 if (level < 1) {if (level < 1)
3fun levelName(level: Int): LevelStatus {4 if (level0 < 1) {5 return LevelStatus(false, "level:missing")6 }outcome ← fail
11 val level = 012 val status = levelName(level0)13 val outcome→ fail = if (status.okfalse) {14 "ok"15 } else {16 "fail"17 }1819 println("level=$level0")20 println("outcome=$outcomefail")21 println("label=${status.labellevel:missing}")22}outputlevel=0 outcome=fail label=level:missing
level ← 5
10fun main() {11 val level→ 5 = 512 val status = levelName(level5)13 val outcome = if (status.ok) {fun levelName(level: Int): LevelStatus
3fun levelName(level5: Int): LevelStatus {4 if (level < 1) {5 return LevelStatus(false, "level:missing")6 }7 return LevelStatus(true, "level:$level5")8}outcome ← ok
11 val level = 512 val status = levelName(level5)13 val outcome→ ok = if (status.oktrue) {14 "ok"15 } else {16 "fail"17 }1819 println("level=$level5")20 println("outcome=$outcomeok")21 println("label=${status.labellevel:5}")22}outputlevel=5 outcome=ok label=level:5