Comment made by: schmee
I've attached a patch which fixes this problem by bringing Clojure's try/catch semantics more inline with Java. For each catch clause, the compiler checks if a previous catch clause is a supertype if the current one. If it is, an IllegalArgumentException is thrown. This is O(n^2) in the number of catch clauses, but since n will be low in the vast majority of cases, and since the work is done at parse time, it should not pose any performance issues.
I had to modify an unrelated test since it actually had multiple catch clauses that caught {{Exception}} which is no longer allowed with this patch.