- Edit -
Извините, я не видел тег java. Несмотря на то, что в следующем примере используются конструкции PHP, принципы должны применяться.
- Original -
Я использую пользовательские коды исключений только в нескольких очень специфических случаях и храню эти коды в пользовательском классе исключений, который расширяет класс исключений по умолчанию. Они хранятся в классе как константы, так как значение на самом деле не имеет значения, но контекст имеет значение.
Рассмотрим:
class CoreLib_Api_Exception extends Exception
{
const EXCEPTION_FORMAT = '%s (%s): %s';
const CODE_FILE_DNE = 100;
const CODE_DIR_BASE_EQUALS_REMOVE = 101;
const CODE_XML_READER_UNABLE_TO_OPEN = 200;
const CODE_XML_READER_UNABLE_TO_READ = 201;
}
// Example usage
class CoreLib_Api_Reader
{
protected function getReader()
{
$reader = new CoreLib_Api_Xml_Reader();
if (!@$reader->open($this->getFileUri())) {
$e = new CoreLib_Api_Exception(sprintf('Could not open %s for parsing', $this->getFileUri()), CoreLib_Api_Exception::CODE_XML_READER_UNABLE_TO_OPEN);
throw $e;
}
}
}
// Calling code
try {
$reader = CoreLib_Api_Reader();
$reader->setFileUri($fileUri);
$reader->getReader();
} catch (Exception $e) {
// If code is anything other than open, throw it
if ($e->getCode() !== CoreLib_Api_Exception::CODE_XML_READER_UNABLE_TO_OPEN) {
throw $e;
}
$e = null;
$reader = null;
}
Используя код исключения, я могу проверить, не может ли читатель открыть файл, если это так, игнорировать исключение и двигаться дальше, в противном случае вызвать исключение и прервать поток.
И если один из моих кодов исключений сталкивается с кодом исключений сторонних производителей, то, как я уже говорил, при использовании констант не имеет значения, какой контекст будет определять, с каким кодом я хочу соответствовать.