TLDR: Используйте вторую форму, чтобы компилятор улавливал ошибки упорядочения.
Причина, по которой вам следует использовать вторую форму, состоит в том, что тогда вы получите ошибку компиляции, если попытаетесьдля обработки типов в неправильном порядке.
Например, это приведет к фактической ошибке компиляции:
try
{
throw new ArgumentOutOfRangeException();
}
catch (Exception)
{
Console.WriteLine("Caught 'Exception'");
}
// This gives a compile error:
// "Error CS0160 A previous catch clause already catches all exceptions of this or of a super type ('Exception')"
catch (SystemException)
{
Console.WriteLine("Caught 'SystemException'");
}
Однако использование if/else if
НЕ приведет к ошибке компиляции, поэтомуошибка остается незамеченной:
try
{
throw new ArgumentOutOfRangeException();
}
catch (Exception ex)
{
if (ex is Exception)
{
Console.WriteLine("Caught 'Exception'");
}
else if (ex is SystemException) // This will never be reached, but no compile error.
{
Console.WriteLine("Caught 'SystemException'");
}
}
Обратите внимание, однако, что такие инструменты, как Resharper, будут предупреждать вас о втором случае.