    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 *
    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}