Delphi вывести сообщение об ошибке

Как сделать в дельфи 7 так, чтобы после нажатия кнопки появлялось окно, аналогичное ошибке с моим текстом, затем после нажатия «ок» ещё одно такое окно и после нажатия «ок» во втором окне приложение закрывалось.

Nicolas Chabanovsky's user avatar

задан 1 мая 2012 в 14:28

Maykop's user avatar

1

Вы хоть читали справку по Delphi? Перехвати исключение, вызови одну, две… пять форм, и на последней поставь процедуру завершения проги. Код давать не буду, сам найдешь в сети. (Полезно для мозга).

ответ дан 1 мая 2012 в 14:34

Вячеслав Кириченко's user avatar

Привет попробуй так (если я правильно понял, что тебе нужно):

if MessageDlg('Твое сообщение об ошибке 1', mtError, mbOK, 0) = mrOk then
    if MessageDlg('Твое сообщение об ошибке 2', mtError, mbOK, 0) = mrOk then
        Close();

ответ дан 1 мая 2012 в 14:34

Lest4t's user avatar

Lest4tLest4t

4062 серебряных знака7 бронзовых знаков

2

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

В Delphi для вывода на экран окна сообщения зарезервирована процедура ShowMessage (либо выполняющая те же операции функция MessageDlg Delphi). Остановимся подробнее на них.

Процедура ShowMessage Delphi:

Применение процедуры ShowMessage позволяет вывести на экран окно с необходимым текстом и кнопкой подтверждения OK. Процедура ShowMessage Delphi организована следующим образом:

Процедура ShowMessage Delphi

откуда Сообщение представляет собой текст, впоследствии выведенный в диалоговом окне.

Пример 1. Представим иллюстрацию окна сообщения, которое получено вследствие выполнения следующей инструкции:

Процедура ShowMessage Delphi

Вывод в окно сообщения Delphi

Заметка. Заголовок окна сообщения, которое выводится при помощи процедуры ShowMessage, содержит название приложения, задающееся на специальной вкладке Application в окне Project Options. В случае, когда названия приложения не указано, заголовок будет включать в себя имя исполняемого файла.

Функция MessageDlg Delphi:

При помощи более универсальной процедуры MessageDlg возможно размещение в окне сообщения одного из стандартных значков, например, «Внимание», а также возможно задание количества и типа командных кнопок и обозначить, какую именно кнопку щелкнул программист. На рисунке ниже представлена иллюстрация окна, выведенного вследствие выполнения следующей инструкции:

Функция MessageDlg Delphi

Функция MessageDlg Delphi

В качестве значения функции MessageDlg выступает число, проверка значения которого может показать, какая командная кнопка завершила диалог. Общий вид обращения к данной функции представлен ниже:

откуда:

  • Сообщение представляет собой некоторый текст;
  • Тип определяет тип сообщения, которое включает в себя информационное, предупреждающее или сообщение о критической ошибке. Определенному типу ставится в соответствие некоторый значок. Именованная константа задает тип сообщения (табл. ниже).

окно сообщения

  • Кнопки выступают в качестве списка кнопок, которые отображаются в окне сообщения. В состав данного списка входят именованные константы, разделенные запятыми (табл. ниже), при этом весь список заключен в квадратных скобках. К примеру, для появления в окне сообщения кнопок OK и Cancel необходимо представить список Кнопки как [mbOk,mbCansel]. Помимо указанных в таблиц выше констант возможно применение и таких констант, как mbAbortRetryIgnore, а также mbYesNoCansel и др. Как правило, данные константы чаще используются в комбинациях командных кнопок диалоговых окон.

  • КонтекстСправки означает параметр, обозначающий раздел справочной системы, который впоследствии выведется на экран при нажатии пользователем на клавишу F1. В случае отсутствия справочной системы, параметр КонтекстСправки должен быть приравнен нулю.

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

В этом уроке мы с вами рассмотрим организацию некоторых сообщений в программе.

Сообщения присутствуют повсюду: когда вы пытаетесь закрыть не сохраненный проект, при появлении ошибки, когда программа сообщает о некотором событии.
Сообщения, «вылетающие» при работе программы, можно разделить на те, которые программист предусмотрел, и системные сообщения.
В большинстве случаев второй тип сообщений имеет непонятный для обычного пользователя вид. Как правило, сообщается англоязычный термин, иногда имеется и шестнадцатеричный адрес ошибки. Например, сообщение «I/O Error» говорит программисту или пользователю об ошибке ввода-вывода. Это может быть попытка записи данных в неоткрытый файл, попытка открыть несуществующий файл и т.п. Если такая ошибка в вашей русскоязычной версии программы имеет место, то, скорее всего данной ситуации программист просто не предусмотрел. В таких случаях, программа может себя повести совершенно непредсказуемо. Ведь вы помните из прошлых уроков, что не проконтролированный кусок программы на присутствие ошибки ведет к моментальному выходу из обрабатываемой процедуры, со всеми вытекающими из этого последствиями.
Но это маленькое отклонение от темы. Идея такова, надо самостоятельно просчитывать все возможные случаи и самостоятельно обрабатывать эти ситуации. Иногда, если надо, предупреждать пользователя об ошибках, может даже сообщать об окончании обработки данных. Вот о таких сообщениях мы и поговорим в этом уроке.

Можно разделить все программные сообщения на: информационные сообщения («Загрузка данных с дискеты завершена») , предупреждающие сообщения («Файл модифицирован. Сохранить?»), сообщения об ошибке («Файл данных программы не найден. Требуется переустановка программы»). Эта разбивка на типы сообщений является, естественно, не полным, его можно продолжать, но об этом немного позже.

Ради экономии своего времени, вы можете всегда, из любого места программы показать пользователю, к примеру, следующее сообщение:

Конечно, сообщение может быть и серьезным, можно подобные окошки использовать и для других целей вывода информации. Дело ваше. Я иногда этот вид сообщений использую для вывода информации о состоянии программы на этапе программирования.
В чем же заключается экономия времени и экономия текста кода программы. Такое сообщение выводится на экран одной строчкой:

ShowMessage(‘Привет!’);

Тип данных в скобках — String.
Все довольно просто, мы с вами эту команду неоднократно применяли в прошлых уроках.
На этой команде работа процедуры (не всей программы!) приостанавливается. Пока пользователь не нажмет на кнопку Ok, работа с приложением становится невозможным, т.е. нельзя «добраться» до окна, расположенного позади. Т.е. это сообщение открывается модально.

Как вы заметили, заголовок окна простой. Он содержит в себе текст, который отображен на панели задач. По умолчанию имеет название запускаемого EXE файла. Изначально это Project1, в последствии вы его можете сохранить под другим именем («Save Project As…»), при этом название проекта, вместе с ним название компилируемого EXE файла меняется.
Изменить название запущенной программы в панели задач можно в любом месте программы с помощью команды:

Application.Title:=’Название программы’;

К примеру, вы обрабатываете довольно объемный размер данных (чтение файлов), и хотите показывать процент выполнения задания прямо в панели задач (как это сделано в программе DrWeb). Ведь пользователь не всегда сможет смотреть на ваш 10-минутный процесс обработки данных, а скорее всего переключится на другую, менее трудоемкую операцию (карточный пасьянс), постоянно следя за процессом обработки на панели задач.

Изначально, еще до запуска программы на выполнение, на этапе разработки, вы можете это задать название программы в панели задач с помощью главного меню delphi «Project», дальше пункт «Options…», в открывшемся окне на вкладке Application указать в поле Title необходимую строку. Эта строка и будет отображена в панели задач. При этом следует помнить, что слишком длинная фраза в кнопке на панели задач полностью не будет показана. При этом она будет обрезана троеточием, а для того, чтобы узнать полное название запущенной программы, нужно будет подвести мышку (всплывающая подсказка Hint вам покажет полное название).

Вы уже знаете все прелести простой команды вывода строки ShowMessage. Из недостатков отмечу, что нельзя отдельно от названия программы в панели задач, менять заголовок окошка, нельзя получить иконку в окошке, нельзя отображать другие кнопки.

В delphi есть, можно сказать, встроенная команда отображения окна сообщения. Звучит оно так:

MessageDLG(ТЕКСТ_СООБЩЕНИЯ,ТИП_СООБЩЕНИЯ,КНОПКИ,ИНДЕКС_ПОМОЩИ);

Скажу сразу, что к нашим программам мы пока не пишем дополнительно файлов справки, поэтому ИНДЕКС_ПОМОЩИ у нас всегда будет нулевым. Для информации скажу, что если у нас таковой файл имеется, то можно в таком сообщении сделать кнопку «Help». Если пользователь озадачен вопросом или сообщением, то может, не закрывая этого окна, узнать подробнее о дальнейших этапах работы при выборе того или иного пункта.
ТЕКСТ_СООБЩЕНИЯ — строковая величина. Как в предыдущей команде, сообщение показывается внутри окна.
ТИП_СООБЩЕНИЯ — может принимать несколько значений. От этих значений зависит содержимое заголовка и иконка в левом верхнем углу окна.

Тип сообщения Описание Вид окна
mtWarning Можно использовать в предупреждающих сообщениях. Например, «Вы действительно желаете удалить все данные с диска С:»
mtError Обычное окошко вывода сообщения об ошибки. Всем знаком его вид т.к. это наиболее частое окно в windows :)
mtInformation Какая-нибудь информация. Например, «Не найден файл настройки, создается заново»
mtConfirmation Это запрос. Запрос на сохранение перед выходом, спрашивает перед удалением параметра, и т.п. На ваш собственный вкус 05.gif (1177 bytes)
mtCustom Это сообщение полностью аналогично ShowMessage

КНОПКИ — содержит в себе массив кнопок, которые следует показывать в сообщении.
Даю перечень кнопок.

* mbYes
* mbNo
* mbOK
* mbCancel
* mbHelp
* mbAbort
* mbRetry
* mbIgnore
* mbAll

Рассказывать про каждую кнопку не буду, т.к. все равно ее название нельзя сменить. А если вам англоязычный термин непонятен, то тогда какой смысл ее применять :).
Массив кнопок задается в квадратных кавычках []. Например, нам надо задать три кнопки Yes, No, Cancel. Это делается так [mbYes,mbNo,mbCancel].
Поскольку кнопки в сообщении могут быть разные, то MessageDLG является функцией. Она возвращает результат нажатой кнопки.
Соответственно указанным выше кнопкам результат может принимать следующие значения

* mrNone — окно сообщения закрыто не с помощью кнопки (Alt+F4 или кнопкой «закрыть»)
* mrAbort
* mrYes
* mrOk
* mrRetry
* mrNo
* mrCancel
* mrIgnore
* mrAll

Рассмотрим пример. Нам надо спросить у пользователя о дальнейших действиях перед выходом из программы.
1. Сохранить файл.
2. Не сохранять файл.
3. Продолжить редактирование.

Var R:Word; // переменная, в которой хранится результат

R:=MessageDLG(‘Сохранить файл перед выходом?’,mtConfirmation,[mbYes,mbNo,mbCancel],0);
if R=mrYes then
// если нажата кнопка Yes
begin
// сохраняем файл и завершаем программу
end;
if R=mrNo then
// если нажата кнопка No
begin
// завершаем работу программы без сохранения
end;
if R=mrCancel then
// если нажата кнопка Cancel
begin
// продолжаем работу без сохранения
end;

Мы рассмотрели команду MessageDLG. Это очень гибкая команда, есть много достоинств, но есть один существенный недостаток — англоязычный интерфейс.

Следующая команда использует системные сообщения пользователю вашей операционной системы. Т.е., если у вас установлена, например немецкая версия windows, то кнопки будут иметь соответствующие названия на немецком языке.
Вот эта команда:

MessageBox(Handle,ТЕКСТ_СООБЩЕНИЯ,ЗАГОЛОВОК_ОКНА,ТИП_СООБЩЕНИЯ);

Первый параметр — указатель на владельца окна сообщения. Этот параметр вам пока ничего не говорит, устанавливайте его в Handle (это ссылка на окно, откуда это сообщение вызывается).
ТЕКСТ_СООБЩЕНИЯ и ЗАГОЛОВОК_ОКНА — имеют тип PChar, поэтому, во избежание недоразумений и появления неизвестного рода ошибок, выдаваемых компилятором, меняйте тип String в PChar «на ходу». Например:

MessageBox(Handle,PChar(‘ТЕКСТ_СООБЩЕНИЯ’),PChar(‘ЗАГОЛОВОК_ОКНА’),…

Это был перевод из одного типа строковой величины в другой тип.

Теперь поговорим о немного сложном параметре ТИП_СООБЩЕНИЯ. Он включает в себя иконку и кнопки.

Кнопки:
* MB_ABORTRETRYIGNORE — кнопки «Прервать», «Повторить», «Пропустить».
* MB_OK — кнопка «Ok».
* MB_OKCANCEL — кнопки «Ok», «Отмена».
* MB_RETRYCANCEL — кнопки «Повторить» и «Отмена».
* MB_YESNO — две кнопки «Да» и «Нет».
* MB_YESNOCANCEL — кнопки «Да», «Нет», «Отмена».

Для того, чтобы отобразить иконку, нужно указать:
* MB_ICONEXCLAMATION
* MB_ICONWARNING
* MB_ICONINFORMATION
* MB_ICONASTERISK
* MB_ICONQUESTION
* MB_ICONSTOP
* MB_ICONERROR
* MB_ICONHAND
Если у вас в сообщении несколько кнопок, а по умолчанию нужно выбрать определенную, то такая кнопка задается:
MB_DEFBUTTON1 — где последняя цифра указывает номер кнопки, выбранной по умолчанию. Это свойство может быть полезным, например, чтобы обезопасить данные от случайного уничтожения. «Удалить файл?». Две кнопки — «Да», «Нет». По умолчанию мы программно выбираем вторую кнопку. Если пользователь сразу нажал на Enter, не осознавая своего поступка, можно сказать по привычке, то ничего страшного не произойдет.

Как же указать параметры иконки, кнопок, кнопки по умолчанию в одном параметре ТИП_СООБЩЕНИЯ. Очень просто. Простым знаком +
Например:
MessageBox(Handle,PChar(‘Выйти из программы?’),PChar(‘Мое сообщение’),MB_ICONINFORMATION+MB_OKCANCEL+MB_DEFBUTTON2);

Выглядит это в программе так, как показано на рисунке:

Итак, MessageBox можно считать идеальной командой вывода сообщения пользователю, которая будет совместима со всеми языковыми версиями windows.

Контроль нажатия на кнопку в MessageBox мы осуществляем аналогично MessageDLG, только возвращаемая величина может принимать следующие значение (соответственно нажатой кнопке):

* IDABORT
* IDCANCEL
* IDIGNORE
* IDNO
* IDOK
* IDRETRY
* IDYES

Диалоговые окна в Delphi. ShowMessage, MessageDlg, MessageDlgPos, InputBox и InputQuery В прошлых уроках к примеру Delphi и TButton. Учимся работать с кнопкой в Delphi. Часть 2. События кнопки мы ознакомились с компонентом TButton и при написании обработчика события кнопки использовали для вывода сообщения процедуру ShowMessage. Поэтому, в этом уроке, предлагаю ознакомиться с основными процедурами и функциями для реализации диалоговых окон, и пример их использования.
Процедура ShowMessage, а также функции MessageDlg и MessageDlgPos отображают окно (панель) вывода сообщений. а функции InputBox и InputQuery отображают окно (панель) для ввода информации.
Процедура ShowMessage
Процедура ShowMessage (const Msg: String) отображает окно сообщения с кнопкой ОК. Заголовок этого окна содержит название исполняемого файла приложения, а строка Msg выводится как текст сообщения. В уроке Delphi и TButton. Учимся работать с кнопкой в Delphi. Часть 2. События кнопки, посвященному компоненту Delphi TButton (кнопка), используя ShowMessage, мы выводили на экран сообщение «Теперь кнопка Закрыть приложение активна».
Для примера давайте создадим новый проект и разместим на нем 5 кнопок (TButton). Как это делать мы уже знаем.
У первой кнопки изменим заголовок (свойство Caption) на «ShowMessage», у второй на «MessageDlg», у третьей на «MessageDlgPos», у четвертой на «InputBox» и у пятой на «InputQuery». Свойство Width у всех этих кнопок изменим на 100. И естественно дадим кнопкам понятные имена, для этого поменяем у кнопок свойство Name на «ShowMessageButton», «MessageDlgButton», «MessageDlgPosButton», «InputBoxButton» и «InputQueryButton».
Теперь давайте создадим обработчик события OnClick для кнопки ShowMessageButton и в нем напишем следующее:

Код

ShowMessage(‘Это простое диалоговое окно.’);

Полностью наша процедура будет выглядеть так:

Код

procedure TForm1.ShowMessageButtonClick(Sender: TObject);
begin
ShowMessage(‘Это простое диалоговое окно.’);
end;

Давайте скомпилируем и запустим нашу программу. Перед нами появится форма с 5-ю кнопками. Если нажать на кнопку ShowMessage, то перед нами появится сообщение «Это простое диалоговое окно».

Рисунок. Окно сообщения с кнопкой ОК, вызываемое процедурой ShowMessage

Поскольку название нашего проекта мы не меняли, то он у нас называется Project1 и соответственно в заголовке этого окна мы видим это имя.

Функция MessageDlg
Функция MessageDlg(const Msg: String; AType: TMsgDlgType; AButtons: TMsgDlgButtons; Helpctx: Longint) : word отображает окно сообщения в центре экрана и позволяет получить ответ пользователя. Параметр Msg содержит отображаемое сообщение.
Окно сообщения может относиться к различным типам и наряду с сообщением содержать картинки. Тип окна сообщения определяется параметром АТуре, который может принимать следующие значения:
mtWarning — окно содержит черный восклицательный знак в желтом треугольнике и заголовок Warning;
mtError — окно содержит белый косой крест в красном круге и заголовок Error;
mtInformation — окно содержит синюю букву «i» в белом круге и заголовок Information;
mtConfirmation — окно содержит синий знак «?» в белом круге и заголовок Confirmation;
mtCustom — окно не содержит картинки, в заголовке выводится название исполняемого файла приложения.

Параметр AButtons задает набор кнопок окна и может принимать любые комбинации следующих значений:
mbYes (кнопка Yes);
mbAbort (кнопка Abort);
mbNo (кнопка No);
mbRetry (кнопка Retry);
mbOk (кнопка OK);
mbIgnore (кнопка Ignore);
mbCancel (кнопка Cancel);
mbAll (кнопка All);
mbHelp (кнопка Help);

Для значения параметра AButtons имеются две константы — mbYesNoCancel и mbOKCancel, задающие предопределенные наборы кнопок:
mbYesNoCancel = [mbYes, mbNo, mbCancel];
mbOKCancel = [mbOK, mbCancel]

При нажатии любой из указанных кнопок (кроме кнопки Help) диалоговое окно закрывается, а результат (свойство ModalResult) возвращается функцией MessageDlg.
Параметр HelpCtx определяет контекст (тему) справки, которая появляется во время отображения диалогового окна при нажатии пользователем клавиши F1. Обычно! значение этого параметра равно нулю.
Ниже приведен пример использования функции MessageDlg:

Код

procedure TForm1.MessageDlgButtonClick(Sender: TObject);
var
rez : TModalResult;
begin
rez := MessageDlg(‘Перед вами пример использования функции MessageDlg?’, mtError, [mbOk, mbNo], 0); // выводим сообщение об ошибке с кнопками OK и NO
if rez = mrOk then ShowMessage(‘Вы согласились’); // если нажали ОК, то появляется сообщение о том что мы согласились
if rez = mrNo then ShowMessage(‘Вы не согласились’); // если нажали NO, то появляется сообщение о том что мы не согласились
end;

Рисунок. Диалоговое окно при использовании функции MessageDlg

Функция MessageDlgPos
Функция MessageDlgPos(const Msg: String; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer) : Word отличается от функции MessageDlg наличием параметров Х и Y, управляющих положением окна на экране.
Давайте немного изменим предыдущий пример и получим:

Код

procedure TForm1.MessageDlgPosButtonClick(Sender: TObject);
var
rez : TModalResult;
begin
rez := MessageDlgPos(‘Перед вами пример использования функции MessageDlgPos?’, mtConfirmation, [mbOk, mbNo], 0, 0, 0); // диалоговое окно выводится с координатfvb X=0 и Y=0
if rez = mrOk then ShowMessage(‘Вы согласились’); // если нажали ОК, то появляется сообщение о том что мы согласились
if rez = mrNo then ShowMessage(‘Вы не согласились’); // если нажали NO, то появляется сообщение о том что мы не согласились
end;

Рисунок. Диалоговое окно при использовании функции MessageDlgPos

Функция InputBox
Функция InputBox(const ACaption, APrompt, ADefault: String): String отображает диалоговое окно для ввода строки текста. Окно выводится в центре экрана и содержит поле ввода с надписью, а также кнопки ОК и Cancel.
Параметр ACaption задает заголовок окна, а параметр APrompt содержит поясняющий текст к полю ввода. Параметр ADefault определяет строку, возвращаемую функцией при отказе пользователя от ввода информации (нажатие кнопки Cancel или клавиши Esc).
Ниже приведен пример использования функции InputBox:

Код

procedure TForm1.InputBoxButtonClick(Sender: TObject);
var
pas : string;
begin
pas := InputBox(‘Авторизация’, ‘Введите пароль’, ‘********’); // Выводим Диалоговое окно, которое запрашивает пароль
if pas = ‘123’ then
ShowMessage(‘Пароль принят’);
if pas <> ‘123’ then
ShowMessage(‘Пароль не правильный’);
end;

Рисунок. Пример использования функции InputBox

Функция InputQuery
Функция InputQuery (const ACaption, APrompt: String; var Value: String): Boolean отличается от функции InputBox тем, что вместо третьего параметра — строки по умолчанию — используется параметр Value, который в случае подтверждения ввода содержит введенную пользователем строку.
В качестве результата функция возвращает логическое значение, позволяющее определить, каким образом завершен диалог. Если нажата кнопка ОК, то функция возвращает значение True, если нажата кнопка Cancel или клавиша Esc — значение False.
В нижеприведенном примере показано использование функции InputQuery:

Код

procedure TForm1.InputQueryButtonClick(Sender: TObject);
var
name: string;
begin
name := ‘Введите имя’;
InputQuery(‘Пользователь’, ‘Введите фамилию’, name); // Выводим диалоговое окно в котором нас просят ввести Имя
ShowMessage(‘Вы ввели ‘+name); // Выводим сообщение с тем именем которое мы ввели
end;

К уроку (статье) Диалоговые окна в Delphi. ShowMessage, MessageDlg, MessageDlgPos, InputBox и InputQuery прилагается исходник, посмотрев который, вы можете ознакомиться с полным исходным кодом программы и посмотреть как работает созданная программа. Исходный код сопровождается комментариями, благодаря чему вы сможете легко в нем разобраться. Но я настоятельно рекомендую делать все самостоятельно. Так вы лучше и быстрее усвоите то, о чем говорилось в этом уроке

Для того чтобы получить возможность скачать исходник Delphi к этому уроку, необходимо посетить сайт рекламодателя. После этого, появится ссылка на исходник Delphi к уроку Диалоговые окна в Delphi. ShowMessage, MessageDlg, MessageDlgPos, InputBox и InputQuery
Нажмите на эту ссылку Ссылка

 
WebSQLNeederrr
 
(2008-06-14 19:09)
[0]

с помощью конструкции try .. exceprion можно экранировать ошибки, а как вывести сообщение об ошибке, скажем в Мемо?


 
AndreyV ©
 
(2008-06-14 19:19)
[1]

Ну и ищи в хелпе по этим ключевым словам. Находится за секунды и с примером.


 
Вообщем Я!
 
(2008-06-14 19:30)
[2]

try
except On E:Exception
  Memo1.Lines.Add (E.Message)
end


 
YurikGL ©
 
(2008-06-14 19:30)
[3]

Че нить типа такого
try
….
except
  on e:exception do
      begin
      MLog.Lines.Add(«Ошибка вышла «+#+e.Message);
      raise Exception.Create(«Ошибка в разтаком-то модуле «+e.Message);
      end;
  end;


 
Юрий Зотов ©
 
(2008-06-14 19:36)
[4]

А On здесь зачем?


 
YurikGL ©
 
(2008-06-14 19:40)
[5]


> А On здесь зачем?

Иначе undeclared identifier: «e»


 
Юрий Зотов ©
 
(2008-06-14 20:06)
[6]

> YurikGL ©   (14.06.08 19:40) [5]

Гы… и верно ведь… позор на мои седины… :o)


 
YurikGL ©
 
(2008-06-14 20:49)
[7]


> Гы… и верно ведь… позор на мои седины… :o)

Вопрос, как к мастеру… насколько корректно
     raise Exception.Create("Ошибка в разтаком-то модуле "+e.Message);
в секции except?
Я использую эту конструкцию для «вытаскивания» всей цепочки ошибок. Т.е. если одна функция вызывает другую, та — третью и т.д. выйдет весь текст ошибки по цепочке.


 
Юрий Зотов ©
 
(2008-06-14 21:37)
[8]

> YurikGL ©   (14.06.08 20:49) [7]

Дык… а что ж тут некорректного? Все нормально.

Совет — посмотрите в сторону Assert, бывает очень полезно. Дело в том, что сообщение EAssertionFailed содержит имя модуля и номер строки. То есть, для локализации ошибки можно использовать что-то типа этого:
on E: Exception do
 Assert(false, "Ошибка " + E.ClassName + ": " + E.Message);


 
Игорь Шевченко ©
 
(2008-06-14 23:28)
[9]

можно и без on, через ExceptObject


 
Германн ©
 
(2008-06-15 01:23)
[10]


> Юрий Зотов ©   (14.06.08 21:37) [8]

На E.ClassName ругается, зараза.


 
Германн ©
 
(2008-06-15 01:31)
[11]


> Германн ©   (15.06.08 01:23) [10]
>
>
> > Юрий Зотов ©   (14.06.08 21:37) [8]
>
> На E.ClassName ругается, зараза.
>

Был не прав. Не ругается и не зараза.
:)


 
Loginov Dmitry ©
 
(2008-06-15 10:45)
[12]

> Дык… а что ж тут некорректного? Все нормально.

Юрий, раньше Вы меня за такое ругали. А теперь это корректно? ;)

Сам обычно использую такую конструкцию:

function ReCreateEObject(E: Exception; const FuncName: string): Exception;
var
 S: string;
begin
 S := Format("%s -> %s", [FuncName, E.Message]);
 Result := ExceptClass(E.ClassType).Create(S);
end;

try
 ......................
except
 on E: Exception do
 begin
   ................
   raise ReCreateEObject(E, "MyFunc");
 end;
end;


 
Юрий Зотов ©
 
(2008-06-15 11:27)
[13]

> Loginov Dmitry ©   (15.06.08 10:45) [12]

1. За

такое

я ругать не мог (потому что это самый обычный способ «ручного» отслеживания и ругать тут не за что). А вот за что-то, хотя внешне и похожее, но по сути

другое

— мог.

2. Зачем пересоздавать объект исключения, если можно просто изменить его Message?


 
Leonid Troyanovsky ©
 
(2008-06-15 11:52)
[14]


> Loginov Dmitry ©   (15.06.08 10:45) [12]

> Сам обычно использую такую конструкцию:


И сейчас будем ругать.
Хотя класс исключения будет тот же, но иная
дополнительная информация будет утеряна.

Сравни

 try
   raise TMyException.Create("error");
 except
   on E: TMyException do
     begin
      E.Message := Format("reraise %s", [E.Message]);
      raise;
     end;
 end;


Regards, LVT.


 
Loginov Dmitry ©
 
(2008-06-15 17:42)
[15]

to [13], [14]

для системных исключений нельзая изменить текст. Изменение текста катит только для родных дельфийский эксепшенов.


 
Leonid Troyanovsky ©
 
(2008-06-15 18:00)
[16]


> Loginov Dmitry ©   (15.06.08 17:42) [15]

> Изменение текста катит только для родных дельфийский эксепшенов.


В дельфи иных исключений и нет.


Regards, LVT.


 
Loginov Dmitry ©
 
(2008-06-15 18:05)
[17]

> В дельфи иных исключений и нет.

Я вот про что:

procedure TForm1.Button6Click(Sender: TObject);
var
 a, b: double;
begin
a := 1;
b := 0;
try
  a := a / b;
  floattostr(a);
except
  on E: Exception do
    begin
     E.Message := Format("reraise %s", [E.Message]);
     raise;
    end;
end;
end;

Куда reraise девается? То-то же!


 
Leonid Troyanovsky ©
 
(2008-06-15 19:17)
[18]


> Loginov Dmitry ©   (15.06.08 18:05) [17]

> Куда reraise девается? То-то же!


Ну и не надо никаких on E: Exception.
Если обработчику неизвестно исключение —
он _обязан_ его пропустить.


Regards, LVT.


 
Игорь Шевченко ©
 
(2008-06-15 19:19)
[19]


> except
>   on E: Exception do
>     begin
>      E.Message := Format(«reraise %s», [E.Message]);
>      raise;
>     end;
> end;

За такой код надо давить


Понравилась статья? Поделить с друзьями:
  • Delphi getlasterror текст ошибки
  • Delphi exception код ошибки
  • Delphi ds150e коды ошибок
  • Delphi dateseparator ошибка
  • Delphi copyfile коды ошибок