PL/SQLで書かれたプログラムがエラーでコケた場合などで、 時々ログとかにこんな風に出力されているのを見ることがあります。
User-Defined Exception
こういうのを見るととても残念な気持ちになりますね。
いや、たぶんコーディングした人は「例外処理はとりあえずOTHERSでSQLERRM出力しとけばいっか」とか いう感じで、
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(SQLERRM);
END;
とか書いて満足しているんでしょうか。

 でもこれって要はこういう感じで、自分で例外定義して、自分の書いたビジネスロジックで例外発生させているのに、その例外を明示的に拾う事なくOTHERS で処理してしまっているということなんですね。
DECLARE
  user_expt exception;
BEGIN
  /* ... */
  IF ... != 0 THEN
    RAISE user_expt;  /*<- raise the exception you defined in your business procedure. */
  END IF;
  /* ... */
EXCEPTION
  /* not defined exception block for your own exceptions  */
  WHEN OTHERS THEN
    dbms_output.put_line(SQLERRM);
END;
/
自分のロジックで発生させているわけなんで、SQLERRMとか出力してみた所で、"User-Defined Exception"くらいの事しか出せないのは、普通に考えれば理解できると思います。

自分のビジネスロジックで発生させる例外はちゃんと明示的に拾って、メッセージも然るべきものを出力するのが最低限の礼儀作法ではないでしょうか。

DECLARE
  l_msg VARCHAR2(240);
  user_expt exception;
BEGIN
  /* ... */
 
  IF ... != 0 THEN
    l_msg := 'your own message for your procedure.';
    RAISE user_expt;  /*<- raise the exception you defined in your business procedure. */
  END IF;
  /* ... */
EXCEPTION
  WHEN user_expt THEN
    dbms_output.put_line( l_msg);
  WHEN OTHERS THEN
    dbms_output.put_line(dbms_utility.format_error_stack);
    dbms_output.put_line(dbms_utility.format_error_backtrace);
END;
/
ビジネスロジックで起きうるケース分例外定義するのは面倒な場合もあると思いますが、そういう場合は例の通りのユーザ定義例外を一つだけ定義して、RAISE する直前に出力させるメッセージを処理しておくのが良いと思います。ログ等にメッセージを出力したりする処理はどれもほとんど同じになるでしょうから、ユーザ定義例外をたくさん定義してそれごとに同じような処理を書くのはやってられなくなるでしょう。

"rase_application_error"を使うでもいいかもしれませんが、その辺はもっとファンクションを共通化したりとか、もう少し複雑な事が必要になった時に考えればよい所かな、と個人的には思います。

OTHERS例外は大部分は想定外なものでOracleが勝手に発生させてくる例外を処理するのに使う。
便宜的に SQLERRM を出力しておく、とかでもいいんですけど、最近のバージョンだったら DBMS_UTILITY の FORMAT_ERROR_STACK とか FORMAT_ERROR_BACKTRACE とかを使えば、どのプロシージャの何行目でエラーが発生したかまでわかるので、こっちの方がよいでしょう、きっと。

さらに、ループ回して何かしているのであれば、ループ中のどのデータでエラーが起きたかがわかるようにキー項目をどこかに保持しておいて、エラー処理の中で一緒に出力してあげれば、まあOHTERS例外の処理としては大体OKなんではないでしょうか。

あと、もう少し複雑なプログラム構造になった時の話として、本当に想定外なんで処理終了してしまえばいいという意味でのOTHERS例外はコールスタックの最上位で定義しておけばよくて、サブプロシージャやサブファンクションごとに OTHERS例外記述してリターンとかOUTでエラー返して、コール元がエラーかどうか判定してユーザ定義例外起こしてエラー終了みたいなまどろっこしい事はやめましょう。また、OTHERS で拾っておいて何もせずに"RAISE;" とかいうのは最悪なのでやめて欲しい。FORMAT_ERROR_BACKTRACE とかでエラーの発生位置が正確にわからなくなったりする事があると思います。

参考まで。