Я не очень часто использую объекты исключений; в основном потому, что обычно достаточно строки и требует меньше работы. Это потому, что обычно программа ничего не может сделать с этим исключением. Если бы он мог избежать исключения, он не вызвал бы его в первую очередь.
Если вы можете что-то сделать с исключениями, используйте объекты. Если вы просто собираетесь убить программу (или какое-то подмножество, скажем, веб-запрос), не тратьте время на разработку сложной иерархии объектов, которые ничего не делают, кроме как содержат сообщение.
Что касается № 4; $SIG{__DIE__}
никогда не должен использоваться. Это не сочиняет; если один модуль ожидает, что sigdie будет работать одним способом, а другой модуль загружен, что заставляет его работать другим способом, эти модули больше нельзя использовать в одной и той же программе. Так что не делай этого.
Если вы хотите использовать объекты, просто сделайте очень скучный die Object->new( ... )
. Возможно, это не так увлекательно, как какое-то сверхъестественное волшебство, но оно всегда работает, и код делает именно то, что говорит.