Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как анализировать отловленный exception?


Автор: кварк 26.11.2004, 08:57
Мучаюсь вопросом: ловлю exception.

Код

try
 . . .
except
 on e:exception do ShowMessage(e.Message);
end;


А как проанализировать, какое именно исключение поймано? Неужели строки сравнивать? Так при разных локальных установках, строки Message, видимо, тоже разными будут (мной лично не проверено). Как быть? Может, есть какой-нибудь числовой идентификатор, которого я не нашел?

Автор: SPrograMMer 26.11.2004, 09:44
Строки сравнивать это уж сильно smile !
Каждое Exception принадлежит какому-то классу, например,

Код

...
On EDivByZero Do ...  // Было деление на нуль
On EStackOverflow Do ...  // Переполнение стека
On EConvertError Do ... // было неверное приведение типа
//И т.д.
Else // Было другое исключение
End;

Автор: кварк 26.11.2004, 10:21
Э... А если я не знаю класса? Хотя знаю, дебагер выдает: EOleException. А уж у этого класса есть ErrorCode. Его, по всей видимости, и надо смотреть. Ведь так? :-)

Автор: <Spawn> 26.11.2004, 12:00
Зачем тебе код ошибки? Забудь про них. Экземпляр класса ошибки уже дает понять в чем дело. Например:

Код

on E: EDivByZero do
 //Понятно что произошло деление на ноль


Аналогичный вариант:

Код

on E: Exception do
 if E is EDivByZero then //можешь себе тут представить что if E = <Код деления на 0> then ...
   ...


Цитата
Э... А если я не знаю класса?
A если я не знаю кода ошибки? Ты должен предполагать возможные исключительные ситуации в зависимости от используемых обьектов и операций и использовать соответстующие классы ошибок для их идентификации .

Автор: Alex 26.11.2004, 12:57
кварк, а для чего именно ты хочешь отлавливать ошибку. Если для того, чтобы дать более понятное сообщение, то во первых можно перевести все тексты сообщений, которые имеются в Delphi (могу дать уже переведенные), во вторых можно к тому сообщению, которое у тебя имеется в e.Message в начало добавить осмысленный текст к примеру:
Код

try
...
// Запись в базу
...
except
on e:exception do ShowMessage('Произошла ошибка при записи в базу:'^M^Je.Message);
end;


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

Автор: кварк 26.11.2004, 13:56
Надо перебрать записи. Функция перебора (не мной написанная) возвращает исключение: нет больше записей. Если его поймаешь, то больше ничего делать не надо. А если я поймаю чего-то другое? - задумался я. То есть как-то надо отличить в общем то, нормальную ситуацию от ненормальной. Сделал как написал ранее, через ErrorCode:
Код

try
 цикл . . .
except
 on e: EOleException do if e.ErrorCode <> -2147024637 then tsl.Add('Ошибка [' + IntToStr(e.ErrorCode) + ']: ' + e.Message);
 on e: Exception do tsl.Add(' Ошибка: ' + e.Message);
end;

Вроде, работать будет достаточно надежно. Или я не прав?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)