2023年8月29日追記
以下の記事の内容はKittehの正式なエラーハンドリングをすればとくに悩むことじゃなかったのでそちらを説明しているドキュメントを共有しておきます。
javaのIRCクライエントライブラリのKittehで、暗号化なしでサーバ接続しようとするとエラーがコンソールに出力されます。
接続処理
Client client = Client.builder()
.nick("kitteh")
.server()
.host("127.0.0.1")
.password("1234567890")
.port(6667, SecurityType.INSECURE)
.then()
.buildAndConnect();
コンソールに出力される内容
org.kitteh.irc.client.library.exception.KittehNagException: Nag! This is not a fatal exception! Just a problem requiring your attention: Connection is insecure. If the server does not support TLS, consider enabling STS support to facilitate automatic TLS upgrades when it does.
at org.kitteh.irc.client.library.defaults.DefaultClient.initialize(DefaultClient.java:310)
at org.kitteh.irc.client.library.defaults.DefaultBuilder.build(DefaultBuilder.java:456)
at org.kitteh.irc.client.library.defaults.DefaultBuilder.buildAndConnect(DefaultBuilder.java:475)
以下略
このコンソール出力を抑制したかったのですが、接続処理をtry句で囲んでもキャッチしてくれず最初困りました。
よくよく調べてみるとこのエラー出力は、生成されたKittehNagException
インスタンスをthrow
せずに、ただThrowable::printStackTrace
を呼んでいるだけでした。
(詳しい調査内容は省きますが、例外の処理方法を指定しているのはここです。)
エラー出力処理を大雑把に書き下すとこんな感じ
new KittehNagException("だめです").printStackTrace();
ですので、標準エラーの出力をオフにすればこの出力を抑制できると思われます。
次のようにすればエラーが出力されないようにできました。念のため出力先を元に戻すコードもまとめてます。
PrintStream errDf = System.err; // デフォルトの出力先をバックアップ
System.setErr(new PrintStream(OutputStream.nullOutputStream())); // 標準エラーの出力先を何もしないOutputStreamに変更
new KittehNagException("だめです").printStackTrace();
System.setErr(errDf); // 出力先をデフォルトのものに戻す。