exception 独自 - Javaでカスタム例外タイプを作成するには?



作り方 独自例外 (9)

カスタム例外クラスの作成に関する素晴らしい答え。 あなたが問題の例外を再利用するつもりなら、私は彼らの答え/アドバイスに従います。 ただし、メッセージですぐに例外をスローする必要がある場合は、その場で基本例外クラスを使用できます

String word=reader.readLine();

if(word.contains(" "))
  /*create custom exeception*/
  throw new Exception("My one time exception with some message!");
}

可能な重複:
私は自分で例外を書くことはできますか?

私はJavaでカスタム例外を作成したいと思いますが、どうすればいいですか?

...

try{

...

String word=reader.readLine();

if(word.contains(" "))
  /*create custom exception*/

}
catch(){

throw new...例外をthrow new...てカスタム例外を作成すると、 unreported exception...must be caught or declared to be thrownを取得しますunreported exception...must be caught or declared to be thrown


例外を作成して投げることができるので

if ( word.contains(" ") )
{
     throw new RuntimeException ( "Word contains one or more spaces" ) ;
}

より正式なものにしたい場合は、Exceptionクラスを作成することができます

class SpaceyWordException extends RuntimeException
{

}

いずれにしても、 RuntimeExceptionを使用すると、新しいExceptionがチェックされなくなります。


例外を他の場所で新しいクラスとして定義する必要があります

public class YourCustomException extends Exception{

//Required inherited methods here
}

その後、あなたはあなたの好きなだけYourCustomExceptionをスローしてキャッチすることができます。


Exception(チェックされた例外の場合)またはExceptionのサブクラス、RuntimeException(実行時例外の場合)またはRuntimeExceptionのサブクラスを拡張するクラスを作成するだけで済みます。

次に、あなたのコードでは、

if (word.contains(" "))
    throw new MyException("some message");
}

Javaチュートリアルを読んでください。 これは、すべてのJava開発者が知っておく必要がある基本的なものですhttp://docs.oracle.com/javase/tutorial/essential/exceptions/ : http://docs.oracle.com/javase/tutorial/essential/exceptions/


java.lang.Exception継承して独自の例外を作成することができます。これを行うのに役立つ例を次に示します。


Exceptionから拡張する点を除いて、例外は他のクラスと同様のクラスです。 だからあなたが自分のクラスを作るなら

public class MyCustomException extends Exception

そのようなインスタンスを

   throw new MyCustomException( ... );
   //using whatever constructor params you decide to use

そして、 thisは興味深い読書かもしれません


Exceptionクラスを拡張するカスタム例外クラスを作成することができます。次に例を示します。

class WordContainsException extends Exception
{
      // Parameterless Constructor
      public WordContainsException() {}

      // Constructor that accepts a message
      public WordContainsException(String message)
      {
         super(message);
      }
 }

使用法:

try
{
     if(word.contains(" "))
     {
          throw new WordContainsException();
     }
}
catch(WordContainsException ex)
{
      // Process message however you would like
}

慎重なプログラマーは、特別な発生に対して例外をスローすることが多いため、 IllegalArgumentExceptionIllegalStateExceptionUnsupportedOperationExceptionなどの一般的なIllegalArgumentExceptionIllegalStateException価値があります。 IllegalArgumentExceptionは私のお気に入りです:

throw new IllegalArgumentException("Word contains blank: " + word);

"現代のPythonでカスタム例外を宣言するための適切な方法は?"

あなたの例外が実際にはより具体的な例外のタイプでない限り、これは問題ありません:

class MyException(Exception):
    pass

または、より良い(おそらく完璧な)、 pass代わりにdocstring pass与える:

class MyException(Exception):
    """Raise for my specific kind of exception"""

例外サブクラスのサブクラス化

docsから

Exception

システム内に存在しない組み込みの例外はすべて、このクラスから派生しています。 すべてのユーザー定義例外もこのクラスから派生する必要があります。

つまり、例外がより具体的な例外のタイプである場合 、汎用Exceptionではなくその例外をサブクラス化しException (結果は、ドキュメントが推奨するExceptionから引き続き得られException )。 また、少なくともdocstringを提供することもできます(そして、 passキーワードを使用することは強制されません)。

class MyAppValueError(ValueError):
    '''Raise when my specific value is wrong'''

カスタム__init__自分で作成した属性を設定します。 位置引数としてdictを渡すのを避けてください、あなたのコードの将来のユーザーはあなたに感謝します。 廃止予定のメッセージ属性を使用する場合は、それを自分で割り当てるとDeprecationWarningが回避されます。

class MyAppValueError(ValueError):
    '''Raise when a specific subset of values in context of app is wrong'''
    def __init__(self, message, foo, *args):
        self.message = message # without this you may get DeprecationWarning
        # Special attribute you desire with your Error, 
        # perhaps the value that caused the error?:
        self.foo = foo         
        # allow users initialize misc. arguments as any other builtin Error
        super(MyAppValueError, self).__init__(message, foo, *args) 

あなた自身の__str__または__repr__を書く必要はありません。 組み込みのものは非常に使いやすく、 協力して継承することで確実に使用できます。

トップアンケートの批判

たぶん、私は質問を逃したが、なぜそうではない:

class MyException(Exception):
    pass

繰り返しますが、上記の問題は、それをキャッチするために、別の名前を付けて(別の場所に作成した場合はインポートする)、Exceptionをキャッチする必要があります(ただし、すべてのタイプの例外を処理する準備ができていない可能性があります。処理できるように準備されている例外だけをキャッチする必要があります)。 以下同様の批判がありますが、これはsuperで初期化する方法ではありません。メッセージ属性にアクセスするとDeprecationWarningが得られます:

編集:何かをオーバーライドする(または余分な引数を渡す)ために、これを行います:

class ValidationError(Exception):
    def __init__(self, message, errors):

        # Call the base class constructor with the parameters it needs
        super(ValidationError, self).__init__(message)

        # Now for your custom code...
        self.errors = errors

その方法で、エラーメッセージのdictを2番目のパラメータに渡し、後でe.errorsで取得できます

それはまた、渡される正確に2つの議論を必要とする( self除いて)。 これは、将来のユーザーが気付かないという興味深い制約です。

直接的であるために、それはLiskov代用可能性に違反します。

私は両方のエラーを示します:

>>> ValidationError('foo', 'bar', 'baz').message

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    ValidationError('foo', 'bar', 'baz').message
TypeError: __init__() takes exactly 3 arguments (4 given)

>>> ValidationError('foo', 'bar').message
__main__:1: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
'foo'

に比べ:

>>> MyAppValueError('foo', 'FOO', 'bar').message
'foo'




java exception