Иерархии исключения действительно полезны?

Это рассветало на мне, что я никогда не видел единственную иерархию исключения, для которой создание подклассов, но ловля родительского класса было на самом деле полезно (кроме, конечно, для основного Класса исключений, который должен быть получен).

Иерархии исключения действительно полезны, xor все исключения должен быть получен из основного класса исключений языка?

10
задан zneak 27 July 2010 в 20:42
поделиться

2 ответа

Иерархии исключений полезны для группирования связанных исключений вместе, когда вам нужна разная степень детализации перехвата в разных местах.

Самый распространенный вариант использования - это объединение всех исключений приложений в одно место. Это позволяет вам перехватывать MyAppException в любое время, когда вы хотите перехватить все ошибки, исходящие от вашего приложения, но при этом при необходимости перехватить более конкретные исключения. (В .NET для этого предназначался класс ApplicationException , но он устарел по разным причинам.)

Но вы также можете группировать исключения вместе на границах модуля или любым другим способом, который имеет смысл . Используйте FooModuleException для исключений, поступающих из модуля Foo , но перехватывайте и обрабатывайте FooModuleMustFrobnicate , специально внутреннее для Foo . Или любая аналогичная ситуация.

Я использовал все эти шаблоны в разное время.

5
ответ дан 4 December 2019 в 02:49
поделиться

Я никогда не создавал единую иерархию исключений для всего приложения, потому что исключение в целом может иметь разную семантику и, следовательно, должно обрабатываться по-разному.

Некоторые исключения информируют о сбоях в системе, другие исключения информируют об ошибках, а некоторые другие - о каком-то исключительном состоянии, которое может быть корректно восстановлено на более высоком уровне.

Для этой «бизнес-логики» иерархия исключений может помочь вам не нарушить принцип открытого-закрытого при переопределении некоторых методов в потомках.

Рассмотрим следующий пример:

public abstract class Base
{
   /// Perform some business-logic operation
   /// and throw BaseFooException in certain circumstances
   public abstract void Foo();
}

public class Derived1 : Base
{
   /// Perform some business-logic operation
   /// and throw DerivedFooException in certain circumstances.
   /// But caller could catch only BaseFooException
   public abstract void Foo() {}
}

class BaseFooException : Exception {}

class DerivedFooException : BaseFooException {}

Иерархия исключений может быть полезна в настраиваемой структуре или в определенных библиотеках, но в общем случае (в бизнес-приложениях) я не думаю, что создание одной глубокой и широкой иерархии исключений - хорошая идея.

1
ответ дан 4 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: