001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.fukurou.system; 017 018import java.io.PrintStream ; 019import java.io.PrintWriter ; 020 021/** 022 * 共通的に使用されるRuntimeExceptionクラスです。 023 * 024 * RuntimeException を継承しているため、try{} catch() {} は不要です。 025 * 本システムでは、すべてこのエクセプションクラスを継承させたクラスを作成し、用途によって、 026 * 使い分けるようにします。つまり、他のどのような、Throwable が発生したとしても、一旦、 027 * try{} catch() {} で受けて、このクラスのサブクラスを、再度 throw させます。 028 * そして、必要であれば、try{} catch() {} を用いて捕まえて、それぞれの対応処理を行います。 029 * 030 * このクラスには、元々の発生したエクセプション( Throwable )を引数にとり、 031 * その printStackTrace()情報を、自分自身のトレース情報に含めます。 032 * また、引数にオブジェクトを渡すことができますので、object.toString() で、オブジェクトの 033 * 状態を表示できるようにしておけば、手軽にデバッグに使うことが可能になります。 034 * 035 * このRuntimeExceptionを使うと、ThrowUtil#ogStackTrace(String,Throwable) に準拠した 036 * StackTrace を作成します。これは、最初の3行+org.opengionを含む行だけのエラーを出力 037 * しますので、エラーログの容量を大幅に抑えることが可能です。 038 * 039 * @og.group エラー処理 040 * @og.rev 6.4.2.0 (2016/01/29) 新規作成 041 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 042 * 043 * @version 6.0 044 * @author Kazuhiko Hasegawa 045 * @since JDK8.0, 046 */ 047public class OgRuntimeException extends RuntimeException { 048 private static final long serialVersionUID = 642020160129L ; 049 050// private final Throwable orgTh ; 051// private String addMsg ; 052 /** 053 * JDK21対応。警告: [this-escape] サブクラスが初期化される前の'this'エスケープの可能性があります 054 * 055 * @og.rev 8.5.3.2 (2023/10/13) JDK21対応。警告: [this-escape] サブクラスが初期化される前の'this'エスケープの可能性があります 056 */ 057 protected final StringBuilder msgBuf = new StringBuilder( HybsConst.BUFFER_MIDDLE ); // 7.1.0.0 (2020/01/20) 058 059 /** 060 * 詳細メッセージを指定しないで OgRuntimeException を構築します。 061 * 062 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 063 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 064 * 065 * @see java.lang.RuntimeException#RuntimeException() 066 */ 067 public OgRuntimeException() { 068 super(); 069// orgTh = null; 070 } 071 072 /** 073 * 指定された詳細メッセージを持つ OgRuntimeException を構築します。 074 * 075 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 076 * @og.rev 6.9.2.1 (2018/03/12) 引数のメッセージを、内部メッセージにセットしておきます。 077 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 078 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 079 * 080 * @param msg 詳細メッセージ 081 * @see java.lang.RuntimeException#RuntimeException(String) 082 */ 083 public OgRuntimeException( final String msg ) { 084 super( msg ); 085// orgTh = null; 086// if( msg != null ) { addMsg = msg; } // 6.9.2.1 (2018/03/12) 087 addMessage( msg ); // 7.1.0.0 (2020/01/20) 088 } 089 090 /** 091 * 指定されたThrowableオブジェクトを持つ OgRuntimeException を構築します。 092 * 093 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 094 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 095 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 096 * 097 * @param th 例外Throwableオブジェクト 098 * @see java.lang.RuntimeException#RuntimeException(Throwable) 099 */ 100 public OgRuntimeException( final Throwable th ) { 101 super( th ); 102 addMessage( th ); // 7.1.0.0 (2020/01/20) 103 104// super(); 105// orgTh = th ; 106 } 107 108 /** 109 * 指定された詳細メッセージと、Throwableオブジェクトを持つ OgRuntimeException を構築します。 110 * 111 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 112 * @og.rev 6.9.2.1 (2018/03/12) 引数のメッセージを、内部メッセージにセットしておきます。 113 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 114 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 115 * 116 * @param msg 詳細メッセージ 117 * @param th 例外Throwableオブジェクト 118 * @see java.lang.RuntimeException#RuntimeException(String,Throwable) 119 */ 120 public OgRuntimeException( final String msg,final Throwable th ) { 121 super( msg,th ); 122// super( msg ); 123// orgTh = th ; 124// if( msg != null ) { addMsg = msg; } // 6.9.2.1 (2018/03/12) 125 addMessage( msg ); // 7.1.0.0 (2020/01/20) 126 addMessage( th ); // 7.1.0.0 (2020/01/20) 127 } 128 129 /** 130 * 発生元もメッセージも含めたメッセージ文字列を返します。 131 * 132 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 133 * 134 * @param th 元のThrowableオブジェクト 135 */ 136 public final void addMessage( final Throwable th ) { 137 Throwable th2 = th; 138 while( th2 != null ) { 139 final String msg2 = th2.getLocalizedMessage(); 140 if( msg2 != null && msgBuf.indexOf( msg2 ) < 0 ) { // メッセージの重複を除外 141 msgBuf.append( msg2 ).append( HybsConst.CR ); 142 } 143 th2 = th2.getCause(); 144 } 145 } 146 147 /** 148 * 指定された追加メッセージを、printStackTrace() 出力時に、合成します。 149 * 150 * 主に、openGionバージョンや、その他追記したいメッセージを登録することで、 151 * printStackTrace() 出力時に、合成できます。 152 * 複数のメッセージは登録できません。最後に登録したメッセージのみ使用されます。 153 * なお、null のメッセージは登録できません。 154 * 155 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 156 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 157 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 158 * 159 * @param msg 追加メッセージ 160 */ 161 public final void addMessage( final String msg ) { 162// if( msg != null ) { addMsg = msg; } 163 if( msg != null && msgBuf.indexOf( msg ) < 0 ) { // メッセージの重複を除外 164 msgBuf.append( msg ).append( HybsConst.CR ); 165 } 166 } 167 168 /** 169 * このスロー可能オブジェクトの詳細メッセージ文字列を返します。 170 * 171 * 内部メッセージに、原因のメッセージも含めたメッセージです。 172 * 173 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 174 * 175 * @return 詳細メッセージ文字列 176 * @og.rtnNotNull 177 */ 178 @Override // Throwable 179 public String getMessage() { 180 return msgBuf.toString().trim(); 181 } 182 183 /** 184 * このスロー可能オブジェクトおよびそのバックトレースを標準エラー・ストリームに出力します。 185 * 186 * ここのメソッドは、このThrowableオブジェクトのスタック・トレースを、System.errフィールドの 187 * 値であるエラー出力ストリームで出力します。出力の先頭行には、このオブジェクトに対する 188 * toString()メソッドの結果が含まれます。 189 * 残りの行は、以前にfillInStackTrace()メソッドによって記録されたデータを表します。 190 * この情報の書式は実装によって異なりますが、典型的な書式の例を次に示します。 191 * 192 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 193 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をStackTraceに入れる。 194 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 195 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 196 * 197 * @see java.lang.RuntimeException#printStackTrace() 198 */ 199 @Override // Throwable 200 public void printStackTrace() { 201// System.err.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) ); 202// System.err.println( ThrowUtil.ogStackTrace( addMsg,this ) ); 203 System.err.println( ThrowUtil.ogStackTrace( getMessage(),this ) ); // 7.1.0.0 (2020/01/20) 204 } 205 206 /** 207 * このスロー可能オブジェクトとそのバックトレースを指定された印刷ストリームに出力します。 208 * 209 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 210 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 211 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 212 * 213 * @param ps 出力する印刷ストリーム 214 * @see java.lang.RuntimeException#printStackTrace(PrintStream) 215 */ 216 @Override // Throwable 217 public void printStackTrace( final PrintStream ps ) { 218// ps.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) ); 219// ps.println( ThrowUtil.ogStackTrace( addMsg,this ) ); 220 ps.println( ThrowUtil.ogStackTrace( getMessage(),this ) ); // 7.1.0.0 (2020/01/20) 221 } 222 223 /** 224 * このスロー可能オブジェクトとそのバックトレースを指定されたプリント・ライターに出力します。 225 * 226 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 227 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 228 * 229 * @param pw 出力するプリント・ライター 230 * @see java.lang.RuntimeException#printStackTrace(PrintWriter) 231 * @see ThrowUtil#ogStackTrace(String,Throwable) 232 */ 233 @Override // Throwable 234 public void printStackTrace( final PrintWriter pw ) { 235// pw.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) ); 236// pw.println( ThrowUtil.ogStackTrace( addMsg,this ) ); 237 pw.println( ThrowUtil.ogStackTrace( getMessage(),this ) ); // 7.1.0.0 (2020/01/20) 238 } 239 240 /** 241 * スタックトレース要素の配列を返します。 242 * 243 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 244 * @og.rev 6.9.3.0 (2018/03/26) 内部 Throwable が null の場合、長さゼロの StackTraceElementを返します。 245 * @og.rev 7.0.5.0 (2019/09/09) 廃止 246 * @og.rev 7.0.6.4 (2019/11/29) 復活 247 * 248 * @return スタックトレース要素の配列 249 * @see java.lang.RuntimeException#getStackTrace() 250 * @see ThrowUtil#selectElement(Throwable,int) 251 */ 252 @Override // Throwable 253 public StackTraceElement[] getStackTrace() { 254 return ThrowUtil.selectElement( super.getCause() , ThrowUtil.MIN_STACK_SIZE ); 255 } 256 257 /** 258 * このスロー可能オブジェクトの原因を返しますが、原因が存在しないか不明な場合はnullを返します。 259 * 260 * @og.rev 7.0.6.4 (2019/11/29) 常に null を返すようにします。 261 * 262 * @return このスロー可能オブジェクトの原因(常に null) 263 */ 264 @Override // Throwable 265 public Throwable getCause() { 266// return super.getCause() ; 267 return null ; 268 } 269}