diff --git a/README.md b/README.md new file mode 100644 index 0000000..2c6dae5 --- /dev/null +++ b/README.md @@ -0,0 +1,173 @@ +# [errs-java][repo-url] [![Maven Central][mvn-img]][mvn-url] [![GitHub.io][io-img]][io-url] [![CI Status][ci-img]][ci-url] [![MIT License][mit-img]][mit-url] + +A library for handling exceptions with reasons. + +In Java programming, it is cumbersome to implement a separate exception class for each exception case. +However, trying to handle multiple exception cases with a single exception class makes it difficult to distinguish between them. + +The exception class `Exc` provided by this library solves this problem by accepting a `Record` object that represents the reason for the exception. +Since a `Record` object can have any fields, it can store information about the situation at the time the exception occurred. +The type of the `Record` object can be determined and cast using a switch statement, making it easy to write handling logic for each exception case. + +Optionally, when an `Exc` object is instantiated, pre-registered exception handlers can receive notifications either synchronously or asynchronously. +However, to enable this feature, you must specify the system property `-Dgithub.sttk.errs.notify=true` at program startup. + +## Install + +This package can be installed from [Maven Central Repository][mvn-url]. + +The examples of declaring that repository and the dependency on this package in Maven `pom.xml` and Gradle `build.gradle` are as follows: + +### for Maven + +``` + + + io.github.sttk + errs + 0.1.0 + + +``` + +### for Gradle + +``` +repositories { + mavenCentral() +} +dependencies { + implementation 'io.github.sttk:errs:0.1.0' +} +``` + +## Usage + +### Exc instantiation and identification of a reason + +The following code instantiates an `Exc` and throws it. + +```java +package sample; + +import com.github.sttk.errs.Exc; + +public class SampleClass { + + record IndexOutOfRange(String name, int index, int min, int max) {} + + public void sampleMethod() throws Exc { + ... + throw new Exc(new IndexOutOfRange("array", i, 0, array.length)); + } +} +``` + +And the following code catches the exception and identifies the reason with a switch expression. + +```java + try { + sampleMethod(); + } catch (Exc e) { + switch (e.getReason()) { + case IndexOutOfRange reason -> { + String name = reason.name(); + int index = reason.index(); + int min = reason.min(); + int max = reason.max(); + ... + } + ... + } + } +``` + +### Exception notification (Optional) + +> To enable this feature, you must specify the system property `-Dgithub.sttk.errs.notify=true` at program startup. + +This library optionally provides a feature to notify pre-registered exception handlers when an `Exc` is instantiated. +Multiple exception handlers can be registered, and you can choose to receive notifications either synchronously or asynchronously. +To register exception handlers that receive notifications synchronously, use the `Exc.AddSyncHandler` static method. +For asynchronous notifications, use the `Exc.AddAsyncHandler` static method. + +Exception notifications will not occur until the `Exc.fixHandlers` static method is called. +This static method locks the current set of exception handlers, preventing further additions and enabling notification processing. + +```java +package sample; + +import com.github.sttk.errs.Exc; +import static java.time.format.DateTimeFormatter.ISO_INSTANT; + +public class Main { + static { + Exc.addSyncHandlers((exc, tm) -> { + System.out.println(String.format("%s - %s:%d", + exc.getMessage(), exc.getFile(), exc.getLine()); + }); + + Exc.addAsyncHandlers((exc, tm) -> { + removeLogger.log(String.format("%s:%s:%d:%s", + tm.format(ISO_INSTANT), exc.getFile(), exc.getLine(), exc.toString())); + }); + + Exc.fixHandlers(); + } + + record IndexOutOfRange(String name, int index, int min, int max) {} + + public static void main(String[] args) { + try { + throw new Exc(new IndexOutOfRange("array", 11, 0, 10)); + } catch (Exc e) {} + } +} +``` + +```sh +% java -Dgithub.sttk.errs.notify=true sample.Main +sample.Main$IndexOutOfRange { name=array, index=11, min=0, max=10 } - Main.java:25 +``` + +## Native build + +This library supports native build with GraalVM. + +See the following pages to setup native build environment on Linux/macOS or Windows. +- [Setup native build environment on Linux/macOS](https://www.graalvm.org/latest/reference-manual/native-image/) +- [Setup native build environment on Windows](https://www.graalvm.org/latest/docs/getting-started/windows/#prerequisites-for-native-image-on-windows) + +And see the following pages to build native image with Maven or Gradle. +- [Native image building with Maven plugin](https://graalvm.github.io/native-build-tools/latest/maven-plugin.html) +- [Native image building with Gradle plugin](https://graalvm.github.io/native-build-tools/latest/gradle-plugin.html) + +**NOTE:** If serialization for `Exc` is used, it is needed to specify the serialization configurations for derived classes of `Record` indicating the reason and derived classes of `Throwable` indicating the causing exception classes in the `serialization-config.json` file. + +## Supporting JDK versions + +This library supports JDK 21 or later. + +### Actually checked JDK versions: + +- Oracle GraalVM 24.0.1+9.1 (build 24.0.1+9-jvmci-b01) +- Oracle GraalVM 23.0.2+7.1 (build 23.0.2+7-jvmci-b01) +- Oracle GraalVM 21.0.6+8.1 (build 21.0.6+8-LTS-jvmci-23.1-b55) + +## License + +Copyright (C) 2024 Takayuki Sato + +This program is free software under MIT License.
+See the file LICENSE in this distribution for more details. + + +[repo-url]: https://github.com/sttk/errs-java +[mvn-img]: https://img.shields.io/badge/maven_central-0.1.0-276bdd.svg +[mvn-url]: https://central.sonatype.com/artifact/io.github.sttk/errs/0.1.0 +[io-img]: https://img.shields.io/badge/github.io-Javadoc-4d7a97.svg +[io-url]: https://sttk.github.io/errs-java/ +[ci-img]: https://github.com/sttk/errs-java/actions/workflows/java-ci.yml/badge.svg?branch=main +[ci-url]: https://github.com/sttk/errs-java/actions?query=branch%3Amain +[mit-img]: https://img.shields.io/badge/license-MIT-green.svg +[mit-url]: https://opensource.org/licenses/MIT