前提
・フレームワークが下記のような例外処理を用意しています
・フレームワークでは、RuntimeExceptionをキャッチしていません(投げてもいません)

public function hoge()
{
  try {
    if () {
      throw new フレームワークが定義しているException1();
    }
  } catch (フレームワークが定義しているException1 $e) {
  } catch (フレームワークが定義しているException2 $e) {
  }
}

質問1
・アプリケーション層で独自に(例えば下記のような)例外処理を作成しても良いのでしょうか?
・try ~ catch 文は複数あっても良い?
・それとも一つにまとめるべき?

try {
  switch () {
    case 1:
      throw new ユーザ定義Exception();
    case 2:
      throw new RuntimeException();
    default:
      throw new RuntimeException();
  }
} catch (ユーザ定義Exception $e) {
} catch (RuntimeException $e) {
}

質問2
・RuntimeExceptionはフレームワーク側で実装すべき例外処理なのでしょうか?
・予め用意されていたクラスなのでもしかしてそうかもと思ったのですが、関係ない?


質問3
・今回は違うのですが、例えばフレームワーク側でRuntimeExceptionをスローかつキャッチしているのにも関わらず、アプリケーション側でもRuntimeExceptionをスローかつキャッチするのは駄目でしょうか?
・例外クラス名は重複してはいけない?
・あるいは先に書いたものだけ実行される、とかそう言うルールはあるでしょうか?