    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 を作成します。これは、最初の３行＋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        private 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 final 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 final 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}