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

level
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}")
}
  1. level ← 2

    10fun main() {11    val level→ 2 = 2 //@level=0, 512    val status = levelName(level2)13    val outcome = if (status.ok) {
  2. 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}
  3. 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
  1. level ← 0

    10fun main() {11    val level→ 0 = 012    val status = levelName(level0)13    val outcome = if (status.ok) {
  2. fun levelName(level: Int): LevelStatus

    3fun levelName(level0: Int): LevelStatus {4    if (level < 1) {
  3. if (level < 1)

    3fun levelName(level: Int): LevelStatus {4    if (level0 < 1) {5        return LevelStatus(false, "level:missing")6    }
  4. 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
  1. level ← 5

    10fun main() {11    val level→ 5 = 512    val status = levelName(level5)13    val outcome = if (status.ok) {
  2. 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}
  3. 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