例外を再スローする場合は、
throw ex;
ではなく
throw;
と書きます。
上の2つはとてもよく似ていますが処理内容は全く異なります。throw exは実行したメソッドで新しく例外をスローしますが、throwとだけ書いた場合は例外を変更無しに再スローします。”変更無しに”とは、例外が最初に発生した時点のスタックトレースや例外情報をまったく変更しないで再スローするという意味です。
再スローが必要な状況というのは、例外をキャッチして必要な処理を行うのだけど例外が発生したこと自体は呼び出し元に伝えたい。という状況だと思います。たとえばローカル変数に保存してあるファイル名や処理状況を示す値を付加情報を加えるなどです。その場合に、throw ex としてしまうと呼び出し元には例外が発生した箇所ではなく、例外をキャッチした箇所で例外が発生したかのように伝わってしまうので注意が必要です。
今更ながら、理解しました。