User exception classes, unified exception class architecture

This commit is contained in:
sergeych committed 2026-01-07 19:05:07 +01:00
1 parent 2ce6d8e482
commit 1d089db9ff
10 files changed
+307 -75

No files matched your search

+86 -7
View File
@@ -128,9 +128,9 @@ Serializable class that conveys information about the exception. Important membe
| name | description |
|-------------------|--------------------------------------------------------|
| message | String message |
| stackTrace | lyng stack trace, list of `StackTraceEntry`, see below |
| printStackTrace() | format and print stack trace using println() |
| message | String message |
| stackTrace() | lyng stack trace, list of `StackTraceEntry`, see below |
| printStackTrace() | format and print stack trace using println() |
## StackTraceEntry
@@ -150,24 +150,103 @@ class StackTraceEntry(
# Custom error classes
_this functionality is not yet released_
You can define your own exception classes by inheriting from the built-in `Exception` class. This allows you to create specific error types for your application logic and catch them specifically.
## Defining a custom exception
To define a custom exception, create a class that inherits from `Exception`:
```lyng
class MyUserException : Exception("something went wrong")
```
You can also pass the message dynamically:
```lyng
class MyUserException(m) : Exception(m)
throw MyUserException("custom error message")
```
If you don't provide a message to the `Exception` constructor, the class name will be used as the default message:
```lyng
class SimpleException : Exception
val e = SimpleException()
assertEquals("SimpleException", e.message)
```
## Throwing and catching custom exceptions
Custom exceptions are thrown using the `throw` keyword and can be caught using `catch` blocks, just like standard exceptions:
```lyng
class ValidationException(m) : Exception(m)
try {
throw ValidationException("Invalid input")
}
catch(e: ValidationException) {
println("Caught validation error: " + e.message)
}
catch(e: Exception) {
println("Caught other exception: " + e.message)
}
```
Since user exceptions are real classes, inheritance works as expected:
```lyng
class BaseError : Exception
class DerivedError : BaseError
try {
throw DerivedError()
}
catch(e: BaseError) {
// This will catch DerivedError as well
assert(e is DerivedError)
}
```
## Accessing extra data
You can add your own fields to custom exception classes to carry additional information:
```lyng
class NetworkException(m, val statusCode) : Exception(m)
try {
throw NetworkException("Not Found", 404)
}
catch(e: NetworkException) {
println("Error " + e.statusCode + ": " + e.message)
}
```
# Standard exception classes
| class | notes |
|----------------------------|-------------------------------------------------------|
| Exception | root of al throwable objects |
| Exception | root of all throwable objects |
| NullReferenceException | |
| AssertionFailedException | |
| ClassCastException | |
| IndexOutOfBoundsException | |
| IllegalArgumentException | |
| IllegalStateException | |
| NoSuchElementException | |
| IllegalAssignmentException | assigning to val, etc. |
| SymbolNotDefinedException | |
| IterationEndException | attempt to read iterator past end, `hasNext == false` |
| IllegalAccessException | attempt to access private members or like |
| UnknownException | unexpected kotlin exception caught |
| | |
| UnknownException | unexpected internal exception caught |
| NotFoundException | |
| IllegalOperationException | |
| UnsetException | access to uninitialized late-init val |
| NotImplementedException | used by `TODO()` |
| SyntaxError | |
### Symbol resolution errors