Exception
является базовым типом для всех исключений и, как таковой, ужасно неопределенным. Вы никогда не должны вызывать это исключение, потому что оно просто не содержит никакой полезной информации. Вызов кода, перехватывающего исключения, не может отличить намеренно созданное исключение (из вашей логики) от других системных исключений, которые совершенно нежелательны и указывают на реальные ошибки.
Та же причина относится и к SystemException
. Если вы посмотрите на список производных типов, вы увидите огромное количество других исключений с очень разной семантикой.
NullReferenceException
и IndexOutOfRangeException
бывают другого рода. Это очень специфические исключения, поэтому их можно выбросить . Однако вы все равно не захотите их бросать, поскольку они обычно означают, что в вашей логике есть некоторые реальные ошибки. Например, исключение нулевой ссылки означает, что вы пытаетесь получить доступ к члену объекта, который является null
. Если это возможно в вашем коде, вам всегда следует явно проверять null
и генерировать более полезное исключение (например ArgumentNullException
). Так же,IndexOutOfRangeException
s возникают, когда вы обращаетесь к недопустимому индексу (для массивов, а не списков). Вы всегда должны сначала убедиться, что вы этого не делаете, и сначала проверять границы, например, массива.
Есть несколько других исключений, таких как эти два, например InvalidCastException
или DivideByZeroException
, которые возникают из-за определенных ошибок в вашем коде и обычно означают, что вы делаете что-то неправильно или сначала не проверяете некоторые недопустимые значения. Умышленно выбрасывая их из своего кода, вы просто усложняете вызывающему коду определение, были ли они выброшены из-за какой-то ошибки в коде или просто потому, что вы решили повторно использовать их для чего-то в своей реализации.
Конечно, из этих правил есть некоторые исключения (ха). Если вы создаете что-то, что может вызвать исключение, которое точно соответствует существующему, не стесняйтесь использовать это, особенно если вы пытаетесь сопоставить какое-то встроенное поведение. Просто убедитесь, что вы выбрали очень конкретный тип исключения.
В целом, однако, если вы не найдете (конкретного) исключения, которое удовлетворяет ваши потребности, вам всегда следует подумать о создании собственных типов исключений для определенных ожидаемых исключений. Это может быть очень полезно для разделения источников исключений, особенно когда вы пишете код библиотеки.