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 final StringBuilder msgBuf = new StringBuilder( HybsConst.BUFFER_MIDDLE ); // 7.1.0.0 (2020/01/20) 053 054 /** 055 * 詳細メッセージを指定しないで OgRuntimeException を構築します。 056 * 057 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 058 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 059 * 060 * @see java.lang.RuntimeException#RuntimeException() 061 */ 062 public OgRuntimeException() { 063 super(); 064// orgTh = null; 065 } 066 067 /** 068 * 指定された詳細メッセージを持つ OgRuntimeException を構築します。 069 * 070 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 071 * @og.rev 6.9.2.1 (2018/03/12) 引数のメッセージを、内部メッセージにセットしておきます。。 072 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 073 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 074 * 075 * @param msg 詳細メッセージ 076 * @see java.lang.RuntimeException#RuntimeException(String) 077 */ 078 public OgRuntimeException( final String msg ) { 079 super( msg ); 080// orgTh = null; 081// if( msg != null ) { addMsg = msg; } // 6.9.2.1 (2018/03/12) 082 addMessage( msg ); // 7.1.0.0 (2020/01/20) 083 } 084 085 /** 086 * 指定されたThrowableオブジェクトを持つ OgRuntimeException を構築します。 087 * 088 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 089 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 090 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 091 * 092 * @param th 例外Throwableオブジェクト 093 * @see java.lang.RuntimeException#RuntimeException(Throwable) 094 */ 095 public OgRuntimeException( final Throwable th ) { 096 super( th ); 097 addMessage( th ); // 7.1.0.0 (2020/01/20) 098 099// super(); 100// orgTh = th ; 101 } 102 103 /** 104 * 指定された詳細メッセージと、Throwableオブジェクトを持つ OgRuntimeException を構築します。 105 * 106 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 107 * @og.rev 6.9.2.1 (2018/03/12) 引数のメッセージを、内部メッセージにセットしておきます。。 108 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 109 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 110 * 111 * @param msg 詳細メッセージ 112 * @param th 例外Throwableオブジェクト 113 * @see java.lang.RuntimeException#RuntimeException(String,Throwable) 114 */ 115 public OgRuntimeException( final String msg,final Throwable th ) { 116 super( msg,th ); 117// super( msg ); 118// orgTh = th ; 119// if( msg != null ) { addMsg = msg; } // 6.9.2.1 (2018/03/12) 120 addMessage( msg ); // 7.1.0.0 (2020/01/20) 121 addMessage( th ); // 7.1.0.0 (2020/01/20) 122 } 123 124 /** 125 * 発生元もメッセージも含めたメッセージ文字列を返します。 126 * 127 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 128 * 129 * @param th 元のThrowableオブジェクト 130 */ 131 public void addMessage( final Throwable th ) { 132 Throwable th2 = th; 133 while( th2 != null ) { 134 final String msg2 = th2.getLocalizedMessage(); 135 if( msg2 != null && msgBuf.indexOf( msg2 ) < 0 ) { // メッセージの重複を除外 136 msgBuf.append( msg2 ).append( HybsConst.CR ); 137 } 138 th2 = th2.getCause(); 139 } 140 } 141 142 /** 143 * 指定された追加メッセージを、printStackTrace() 出力時に、合成します。 144 * 145 * 主に、openGionバージョンや、その他追記したいメッセージを登録することで、 146 * printStackTrace() 出力時に、合成できます。 147 * 複数のメッセージは登録できません。最後に登録したメッセージのみ使用されます。 148 * なお、null のメッセージは登録できません。 149 * 150 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 151 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 152 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 153 * 154 * @param msg 追加メッセージ 155 */ 156 public void addMessage( final String msg ) { 157// if( msg != null ) { addMsg = msg; } 158 if( msg != null && msgBuf.indexOf( msg ) < 0 ) { // メッセージの重複を除外 159 msgBuf.append( msg ).append( HybsConst.CR ); 160 } 161 } 162 163 /** 164 * このスロー可能オブジェクトの詳細メッセージ文字列を返します。 165 * 166 * 内部メッセージに、原因のメッセージも含めたメッセージです。 167 * 168 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 169 * 170 * @return 詳細メッセージ文字列 171 * @og.rtnNotNull 172 */ 173 @Override 174 public String getMessage() { 175 return msgBuf.toString().trim(); 176 } 177 178 /** 179 * このスロー可能オブジェクトおよびそのバックトレースを標準エラー・ストリームに出力します。 180 * 181 * ここのメソッドは、このThrowableオブジェクトのスタック・トレースを、System.errフィールドの 182 * 値であるエラー出力ストリームで出力します。出力の先頭行には、このオブジェクトに対する 183 * toString()メソッドの結果が含まれます。 184 * 残りの行は、以前にfillInStackTrace()メソッドによって記録されたデータを表します。 185 * この情報の書式は実装によって異なりますが、典型的な書式の例を次に示します。 186 * 187 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 188 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をStackTraceに入れる。 189 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 190 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 191 * 192 * @see java.lang.RuntimeException#printStackTrace() 193 */ 194 @Override 195 public void printStackTrace() { 196// System.err.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) ); 197// System.err.println( ThrowUtil.ogStackTrace( addMsg,this ) ); 198 System.err.println( ThrowUtil.ogStackTrace( getMessage(),this ) ); // 7.1.0.0 (2020/01/20) 199 } 200 201 /** 202 * このスロー可能オブジェクトとそのバックトレースを指定された印刷ストリームに出力します。 203 * 204 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 205 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 206 * @og.rev 7.1.0.0 (2020/01/20) 内部メッセージに、原因のメッセージも含める。 207 * 208 * @param ps 出力する印刷ストリーム 209 * @see java.lang.RuntimeException#printStackTrace(PrintStream) 210 */ 211 @Override 212 public void printStackTrace( final PrintStream ps ) { 213// ps.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) ); 214// ps.println( ThrowUtil.ogStackTrace( addMsg,this ) ); 215 ps.println( ThrowUtil.ogStackTrace( getMessage(),this ) ); // 7.1.0.0 (2020/01/20) 216 } 217 218 /** 219 * このスロー可能オブジェクトとそのバックトレースを指定されたプリント・ライターに出力します。 220 * 221 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 222 * @og.rev 7.0.5.0 (2019/09/09) 自分自身をsuperに入れる。 223 * 224 * @param pw 出力するプリント・ライター 225 * @see java.lang.RuntimeException#printStackTrace(PrintWriter) 226 * @see ThrowUtil#ogStackTrace(String,Throwable) 227 */ 228 @Override 229 public void printStackTrace( final PrintWriter pw ) { 230// pw.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) ); 231// pw.println( ThrowUtil.ogStackTrace( addMsg,this ) ); 232 pw.println( ThrowUtil.ogStackTrace( getMessage(),this ) ); // 7.1.0.0 (2020/01/20) 233 } 234 235 /** 236 * スタックトレース要素の配列を返します。 237 * 238 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 239 * @og.rev 6.9.3.0 (2018/03/26) 内部 Throwable が null の場合、長さゼロの StackTraceElementを返します。 240 * @og.rev 7.0.5.0 (2019/09/09) 廃止 241 * @og.rev 7.0.6.4 (2019/11/29) 復活 242 * 243 * @return スタックトレース要素の配列 244 * @see java.lang.RuntimeException#getStackTrace() 245 * @see ThrowUtil#selectElement(Throwable,int) 246 */ 247 @Override 248 public StackTraceElement[] getStackTrace() { 249 return ThrowUtil.selectElement( super.getCause() , ThrowUtil.MIN_STACK_SIZE ); 250 } 251 252 /** 253 * このスロー可能オブジェクトの原因を返しますが、原因が存在しないか不明な場合はnullを返します。 254 * 255 * @og.rev 7.0.6.4 (2019/11/29) 常に null を返すようにします。 256 * 257 * @return このスロー可能オブジェクトの原因(常に null) 258 */ 259 @Override 260 public Throwable getCause() { 261// return super.getCause() ; 262 return null ; 263 } 264}