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 * 042 * @version 6.0 043 * @author Kazuhiko Hasegawa 044 * @since JDK8.0, 045 */ 046public class OgRuntimeException extends RuntimeException { 047 private static final long serialVersionUID = 642020160129L ; 048 049 private final Throwable orgTh ; 050 private String addMsg ; 051 052 /** 053 * 詳細メッセージを指定しないで OgRuntimeException を構築します。 054 * 055 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 056 * 057 * @see java.lang.RuntimeException#RuntimeException() 058 */ 059 public OgRuntimeException() { 060 super(); 061 orgTh = null; 062 } 063 064 /** 065 * 指定された詳細メッセージを持つ OgRuntimeException を構築します。 066 * 067 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 068 * @og.rev 6.9.2.1 (2018/03/12) 引数のメッセージを、内部メッセージにセットしておきます。。 069 * 070 * @param msg 詳細メッセージ 071 * @see java.lang.RuntimeException#RuntimeException(String) 072 */ 073 public OgRuntimeException( final String msg ) { 074 super( msg ); 075 orgTh = null; 076 if( msg != null ) { addMsg = msg; } // 6.9.2.1 (2018/03/12) 077 } 078 079 /** 080 * 指定されたThrowableオブジェクトを持つ OgRuntimeException を構築します。 081 * 082 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 083 * 084 * @param th 例外Throwableオブジェクト 085 * @see java.lang.RuntimeException#RuntimeException(Throwable) 086 */ 087 public OgRuntimeException( final Throwable th ) { 088 super(); 089 orgTh = th ; 090 } 091 092 /** 093 * 指定された詳細メッセージと、Throwableオブジェクトを持つ OgRuntimeException を構築します。 094 * 095 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 096 * @og.rev 6.9.2.1 (2018/03/12) 引数のメッセージを、内部メッセージにセットしておきます。。 097 * 098 * @param msg 詳細メッセージ 099 * @param th 例外Throwableオブジェクト 100 * @see java.lang.RuntimeException#RuntimeException(String,Throwable) 101 */ 102 public OgRuntimeException( final String msg,final Throwable th ) { 103 super( msg ); 104 orgTh = th ; 105 if( msg != null ) { addMsg = msg; } // 6.9.2.1 (2018/03/12) 106 } 107 108 /** 109 * 指定された追加メッセージを、printStackTrace() 出力時に、合成します。 110 * 111 * 主に、openGionバージョンや、その他追記したいメッセージを登録することで、 112 * printStackTrace() 出力時に、合成できます。 113 * 複数のメッセージは登録できません。最後に登録したメッセージのみ使用されます。 114 * なお、null のメッセージは登録できません。 115 * 116 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 117 * 118 * @param msg 追加メッセージ 119 */ 120 public void addMessage( final String msg ) { 121 if( msg != null ) { addMsg = msg; } 122 } 123 124 /** 125 * このスロー可能オブジェクトおよびそのバックトレースを標準エラー・ストリームに出力します。 126 * 127 * ここのメソッドは、このThrowableオブジェクトのスタック・トレースを、System.errフィールドの 128 * 値であるエラー出力ストリームで出力します。出力の先頭行には、このオブジェクトに対する 129 * toString()メソッドの結果が含まれます。 130 * 残りの行は、以前にfillInStackTrace()メソッドによって記録されたデータを表します。 131 * この情報の書式は実装によって異なりますが、典型的な書式の例を次に示します。 132 * 133 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 134 * @see java.lang.RuntimeException#printStackTrace() 135 */ 136 @Override 137 public void printStackTrace() { 138 System.err.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) ); 139 } 140 141 /** 142 * このスロー可能オブジェクトとそのバックトレースを指定された印刷ストリームに出力します。 143 * 144 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 145 * 146 * @param ps 出力する印刷ストリーム 147 * @see java.lang.RuntimeException#printStackTrace(PrintStream) 148 */ 149 @Override 150 public void printStackTrace( final PrintStream ps ) { 151 ps.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) ); 152 } 153 154 /** 155 * このスロー可能オブジェクトとそのバックトレースを指定されたプリント・ライターに出力します。 156 * 157 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 158 * 159 * @param pw 出力するプリント・ライター 160 * @see java.lang.RuntimeException#printStackTrace(PrintWriter) 161 * @see ThrowUtil#ogStackTrace(String,Throwable) 162 */ 163 @Override 164 public void printStackTrace( final PrintWriter pw ) { 165 pw.println( ThrowUtil.ogStackTrace( addMsg,orgTh ) ); 166 } 167 168 /** 169 * スタックトレース要素の配列を返します。 170 * 171 * @og.rev 6.4.2.0 (2016/01/29) 新規作成。 172 * @og.rev 6.9.3.0 (2018/03/26) 内部 Throwable が null の場合、長さゼロの StackTraceElementを返します。 173 * 174 * @return スタックトレース要素の配列 175 * @see java.lang.RuntimeException#getStackTrace() 176 * @see ThrowUtil#selectElement(Throwable,int) 177 */ 178 @Override 179 public StackTraceElement[] getStackTrace() { 180// return ThrowUtil.selectElement( orgTh == null ? this : orgTh , ThrowUtil.MIN_STACK_SIZE ); 181 return orgTh == null ? new StackTraceElement[0] 182 : ThrowUtil.selectElement( orgTh , ThrowUtil.MIN_STACK_SIZE ); 183 } 184}