По поводу первого вопроса. Нет, во время компиляции все исключения не приводятся к определенному типу. То есть бросается исключение DevideByZeroException, а потом последовательно в блоках catch ищется тот тип, к которому это исключение можно привести.
Например, вы можете выполнять разные действия при разных исключениях. Код, в котором ловится исключение типа Exception выполнится только в том случае, если сгенерированное исключение не может быть приведено к типам, описанным ранее
try
{
//Code
}
catch ( DivideByZeroException ex )
{
}
catch ( ArithmeticException ex )
{
}
catch ( Exception ex )
{
}