Как отключить ошибки в delphi

is there any way to turn off exception message showing during run-time in Delphi application?
i think there must be a directive to turn off exception message but i cant remember it.

asked May 18, 2010 at 14:47

vesal's user avatar

3

Most exception messages can be suppressed by handling the TApplication.OnException event. The application object only displays an exception message if there isn’t a handler assigned to that event. You’re welcome to call TApplication.ShowException in your handler for certain exceptions if you want.

That event is fired for exceptions that occur while running in the VCL message loop. Exceptions that occur elsewhere terminate either your program or the current thread. Also, the event is fired only for exceptions that descend from Exception; exceptions that descend from other classes are passed directly to SysUtils.ShowException.

Whether you display a message or not, your program is still in an indeterminate state once an exception has occurred that you haven’t handled. Merely suppressing the message is akin to sweeping the dust under the rug. A better course of action is to use an exception-logging tool like MadExcept, EurekaLog, or JclDebug that records information about the exception and gives your customers the option of sending the reports back to you so you can reproduce the conditions of the error and fix it.

answered May 18, 2010 at 15:48

Rob Kennedy's user avatar

Rob KennedyRob Kennedy

161k21 gold badges275 silver badges465 bronze badges

1

I use the IDE to turn it off:

In Delphi 2007, click Tools / Options and go right down to Debugger Options / CodeGear debuggers / Native OS Exceptions. Select «Run Unhandled». The debugger will not halt on exceptions, but act the same as running from an exe. Exceptions will be handled as such.

For directives, I don’t know of one that can exactly do the above, but maybe this will help:

http://www.delphibasics.co.uk/ByType.asp?Type=Compiler%20Directive

answered May 18, 2010 at 15:05

Hein du Plessis's user avatar

Hein du PlessisHein du Plessis

3,2956 gold badges34 silver badges51 bronze badges

Are you running OpenGL by any chance? I’ve not tried it with the more recent Codegear/OpenGL builds, but there used to be an issue that OpenGL didn’t disable FPU exceptions but the IDE expected these to be turned off by default (as Microsoft libraries do) so the IDE would report FPU exceptions ad-nauseam despite these being of no consequence.

The solution was to explicitly turn of FPU exceptions, which you can do in code using the statement.

Set8087CW($133F);

There may be other libraries where this causes an issue too.

Mason Wheeler's user avatar

Mason Wheeler

82.1k50 gold badges268 silver badges477 bronze badges

answered May 18, 2010 at 15:17

Cruachan's user avatar

CruachanCruachan

15.7k5 gold badges59 silver badges112 bronze badges

what is most standard and simple way to tell a prevent Delphi program to show ANY message windows when user run the exe?

for example this is my program with a web browser object, when site have errors that Geko component showing errors to user… i want to stop it.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, MOZILLACONTROLLib_TLB;

type
  TForm1 = class(TForm)
    MozillaBrowser1: TMozillaBrowser;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   MozillaBrowser1.Navigate('http://www.xeex.ir');
end;

end.

asked Oct 5, 2014 at 12:58

user3678448's user avatar

5

There’s no way to do what you ask in general. You cannot apply a setting that will stop all error dialogs being shown.

For native Delphi exceptions, you can choose to ignore them if you wish. Not that that would be a good idea. For message boxes shown by third party code you need that code to offer a way to suppress those errors. If that mechanism exists, you can of course use it. But if no mechanism exists then you are out of luck. And every different library will use separate mechanisms.

answered Oct 5, 2014 at 13:26

David Heffernan's user avatar

David HeffernanDavid Heffernan

599k42 gold badges1064 silver badges1482 bronze badges

2

 
Ануфрий
 
(2007-08-03 19:30)
[0]

С некоторых пор Дельфи стал показывать сообщения об ошибках (исключениях), которые пойманы через try.

Т.е. код до этого
try
 I := деление на ноль;
finally
end

Приводил к тому, что в режиме отладки дельфи сообщал об ошибке, и после нажатия F9 программа дальше работала. Без дельфи прога вообще ничего не выдавала.
Теперь показывается сообщение дельфи и после F9 вылетает MessageBox.
А если запускать без дельфи, то просто вылетает MessageBox (типа деление на ноль).
Раньше все было нормально, не пойму что случилось и как это убрать.


 
Dib@zol ©
 
(2007-08-03 19:32)
[1]

А может просто не делить на ноль??? Или это просто такой пример?


 
Ануфрий
 
(2007-08-03 19:35)
[2]

Это пример.


 
Anatoly Podgoretsky ©
 
(2007-08-03 19:39)
[3]

> Ануфрий  (03.08.2007 19:35:02)  [2]

В этом примере не делить на ноль.


 
Ануфрий
 
(2007-08-03 19:42)
[4]

Ну тогда другой пример.

var
 HTTP: TIdHTTP;
 Str: string;
begin
 HTTP := TIdHTTP.Create(nil);
 try
   Str := HTTP.Get("http://my_domain.com");
 finally
   HTTP.Free;
 end;
end;

При запуске вызывается исключение (сайт не найден). Мне нужно чтобы на экран не выдавалось сообщение с текстом исключения.


 
Dib@zol ©
 
(2007-08-03 19:43)
[5]

var
HTTP: TIdHTTP;
Str: string;
begin
HTTP := TIdHTTP.Create(nil);
try
  Str := HTTP.Get(«http://my_domain.com»);
finally
  HTTP.Free;
end;
end;

try..finally заменяй на try..except.


 
Anatoly Podgoretsky ©
 
(2007-08-03 19:45)
[6]

> Ануфрий  (03.08.2007 19:42:04)  [4]

Чтобы на экран не выдавалось сообщение, исключение надо обработать самому, это блок try except end


 
Anatoly Podgoretsky ©
 
(2007-08-03 19:46)
[7]

> Dib@zol  (03.08.2007 19:43:05)  [5]

try..finally убирать нельзя, это будет уже другая ошибка дизайна, например утечка как минимум


 
Ануфрий
 
(2007-08-03 19:49)
[8]

Dib@zol
Спасибо, работает. Хотя я всегда думал, что finally также «поглощает» ошибки, как except, только в отличие от последнего вызывается всегда, даже если ошибок нет. И вроде бы так и работало… Может просто не разу ошибок не попадалось внутри try finally end;


 
Ануфрий
 
(2007-08-03 19:52)
[9]

Anatoly Podgoretsky
Так нужно делать вложенные try что-ли?
var
HTTP: TIdHTTP;
Str: string;
begin
HTTP := TIdHTTP.Create(nil);
try
  try
    Str := HTTP.Get("http://my_domain.com");
  except
  end;
finally
  HTTP.Free;
end;
end;

Тогда наверное проще заменить на
var
HTTP: TIdHTTP;
Str: string;
begin
 HTTP := TIdHTTP.Create(nil);
 try
   Str := HTTP.Get("http://my_domain.com");
 except
 end;
 HTTP.Free;
end;

?


 
Ануфрий
 
(2007-08-03 19:56)
[10]

Посмотрел старый код. Раньше у меня тоже было try finally end. И никогда ошибки на экран не выдавались.


 
Zagaevskiy ©
 
(2007-08-03 19:57)
[11]

Может ошибок там не было?


 
Инс ©
 
(2007-08-03 19:57)
[12]


> Тогда наверное проще заменить на

В данном конкретном случае можно, но вообще лучше 1-й вариант.


 
{RASkov} ©
 
(2007-08-03 19:58)
[13]

> [9] Ануфрий   (03.08.07 19:52)
> Тогда наверное проще заменить на
> var
> HTTP: TIdHTTP;
> Str: string;
> begin
> HTTP := TIdHTTP.Create(nil);
> try
>   Str := HTTP.Get(«http://my_domain.com»);
> except
> end;
> HTTP.Free;
> end;
> ?

Не верно!

var
HTTP: TIdHTTP;
Str: string;
begin
 HTTP := TIdHTTP.Create(nil);
 try
  try
   Str := HTTP.Get("http://my_domain.com");
  except
   ShowMessage("Произошла ошибка такая-то");
  end;
 finally
  HTTP.Free;
 end;
end;


 
Инс ©
 
(2007-08-03 19:58)
[14]


> [10] Ануфрий   (03.08.07 19:56)

Почитай Рихтера, у него отлично механизм исключений расписан.


 
Anatoly Podgoretsky ©
 
(2007-08-03 20:01)
[15]

> Ануфрий  (03.08.2007 19:52:09)  [9]

Для данного кода можно написать с одним блоком, но обычно код сложнее и

except
end

Лучше заменить на

except
 что то полезное.
end


 
Anatoly Podgoretsky ©
 
(2007-08-03 20:08)
[16]

> Anatoly Podgoretsky  (03.08.2007 20:01:15)  [15]

Хотя бы на

except
  on E.Exception do begin
//     variable := E.Message
//или
//     LOG(llCriticalLevel, «Ошибка HTTP.Get(http://my_domain.com) = » + E.Message);
  end;
end

Это позволит как минимум поставить точку останова для отладки.


 
Ануфрий
 
(2007-08-03 20:10)
[17]

Все, спасибо всем, просто заработался.


function GetBody(const URL: string): string;
var
 HTTP: TIdHTTP;
 Str: string;
begin
 Result := "";
 HTTP := TIdHTTP.Create(nil);
 try
   Result := HTTP.Get("http://my_domain.com");
 finally
   HTTP.Free;
 end;
end;

а далее вызов так

 try
   S := GetBody("http://domain.com");
 except
   S := "";
 end;

потому ошибки не было. А когда я начал разбираться с GetBody, видел только finally и это меня смутило, почему вдруг стали ошибки появляться. :)


 
Anatoly Podgoretsky ©
 
(2007-08-03 20:23)
[18]

> Ануфрий  (03.08.2007 20:10:17)  [17]

Вот это грамотный код.


>
настройка компилятора — не показывать ошибки

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
06.01.11, 19:56

    Full Member

    ***

    Рейтинг (т): 1

    юзаю try except… запускаю прогу в компиляторе — всеравно выдает ошибку
    компилирую и запускаю сам ексешник — ошибок нет,все норм.

    Собственно как отключить эту штуку в компиляторе что бы спокойно можно было из компилятора запускать??
    подскажите плиз

    Сообщение отредактировано: 8ka — 06.01.11, 19:57


    CodeMonkey



    Сообщ.
    #2

    ,
    06.01.11, 22:06

      Tools/Options/Debugger/Stop on exceptions.


      northener



      Сообщ.
      #3

      ,
      07.01.11, 00:58

        Цитата 8ka @ 06.01.11, 19:56

        Собственно как отключить эту штуку в компиляторе что бы спокойно можно было из компилятора запускать??
        подскажите плиз

        Не надо это делать!
        Тем самым вы сами себе «серпом по фабержам»!
        Спокойно «запускать» под встроенном отладчиком (а не «из компилятора», как вы сказали) вам ничего не мешает. Он (отладчик) вам только всегда напоминает об ошибках. И только если вы уверены на 100%, что вы «грамотно» обработали все ошибки, вы можете выключить опцию «Stop on exceptions».
        Хотя я не понимаю для чего это нужно!


        Alexander N



        Сообщ.
        #4

        ,
        07.01.11, 06:37

          Цитата northener @ 07.01.11, 00:58

          Хотя я не понимаю для чего это нужно!

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


          leo



          Сообщ.
          #5

          ,
          07.01.11, 09:40

            Цитата Alexander N @ 07.01.11, 06:37

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

            Если «таких файлов много», то это уже не исключительная ситуация, а вполне штатная, поэтому логичнее было бы просто (локально) отключить генерацию исключений при открытии файлов по {$I-} и проверять успешность по IOResult


            Alexander N



            Сообщ.
            #6

            ,
            07.01.11, 10:24

              Цитата leo @ 07.01.11, 09:40

              Если «таких файлов много», то это уже не исключительная ситуация, а вполне штатная, поэтому логичнее было бы просто (локально) отключить генерацию исключений при открытии файлов по {$I-} и проверять успешность по IOResult

              Как? Я же через TFileStream работал?

              Сообщение отредактировано: Alexander N — 07.01.11, 10:28


              leo



              Сообщ.
              #7

              ,
              07.01.11, 10:50

                Цитата Alexander N @ 07.01.11, 10:24

                Как? Я же через TFileStream работал?

                Еще лучше — значит нужно было работать через THandleStream + FileOpenFileClose без всяких IOResult ;)
                По любому, как ни крути, а исключение должно быть не правилом, а исключением из правил :)


                Alexander N



                Сообщ.
                #8

                ,
                07.01.11, 10:53

                  Цитата leo @ 07.01.11, 10:50

                  Еще лучше — значит нужно было работать через THandleStream + FileOpenFileClose без всяких IOResult

                  А как позицию хранить? Блоками читать?


                  leo



                  Сообщ.
                  #9

                  ,
                  07.01.11, 11:28

                    Цитата Alexander N @ 07.01.11, 10:53

                    А как позицию хранить? Блоками читать?

                    О чем это ты ? TFileStream это совершенно куций фантик для THandleStream, и делает он всего две элементарные вещи:
                    1) в конструкторе вызывает inherited Create(FileOpen(FileName, Mode)) + проверяет хэндл файла и генерит исключение при FHandle < 0
                    2) в деструкторе закрывает файл по if FHandle >= 0 then FileClose(FHandle);
                    Спрашивается, что изменится, если открытие и закрытие файла вынести наружу и юзать THandleStream в «чистом виде» ?

                    Добавлено 07.01.11, 11:43

                    ExpandedWrap disabled

                      var

                        h:integer;

                        strm:THandleStream;

                      begin

                        …

                        h:=FileOpen(FName,Mode);

                        if h >= 0 then

                        begin

                          strm:=THandleStream.Create(h);

                          try

                            …

                          finally

                            strm.Free;

                            FileClose(h);  

                          end;

                        end

                        else

                          … //ошибка открытия файла GetLastError

                      end;

                    Сообщение отредактировано: leo — 07.01.11, 11:44


                    Alexander N



                    Сообщ.
                    #10

                    ,
                    07.01.11, 11:57

                      А у меня массив из TFileStream — как его заменить?

                      Добавлено 07.01.11, 11:57
                      Переменной длины


                      leo



                      Сообщ.
                      #11

                      ,
                      07.01.11, 12:44

                        Цитата Alexander N @ 07.01.11, 11:57

                        А у меня массив из TFileStream — как его заменить?

                        Час от часу не легче ;)
                        Ну определи тогда свой класс, который будет закрывать файл в деструкторе

                        ExpandedWrap disabled

                          type

                             TMyFileStream = class(THandleStream)

                               destructor Destroy;override;

                             end;

                          destructor TMyFileStream.Destroy;

                          begin

                             if Handle >= 0 then FileClose(Handle);

                             inherited;

                          end;

                          var

                             files:array of TMyFileStream;

                             h:integer;

                          begin

                             …

                             h:=FileOpen(FName,Mode);

                             if h >= 0 then

                             begin

                               SetLength(files,Length(files)+1);

                               files[Length(files)-1]:=TMyFileStream.Create(h);

                               …

                             end

                             else

                               … //GetLastError

                          end;


                        Alexander N



                        Сообщ.
                        #12

                        ,
                        07.01.11, 13:04

                          Цитата leo @ 07.01.11, 12:44

                          Ну определи тогда свой класс, который будет закрывать файл в деструкторе

                          Ну а зачем, если уже есть TFileStream и его хватает с лихвой? :)


                          leo



                          Сообщ.
                          #13

                          ,
                          07.01.11, 15:38

                            Цитата Alexander N @ 07.01.11, 13:04

                            Ну а зачем, если уже есть TFileStream и его хватает с лихвой?

                            Ага с очень большой лихвой, упомянутой тобой в #4 ;)
                            Реализация TFileStream предполагает, что ошибка открытия файла, это маловероятная = исключительная ситуация, поэтому «безобидно»»безболезненную» проверку на Handle < 0 превращает в исключительную raise EFOpenError, «ставя на уши» не только саму прогу, но и всю систему в целом — не зря же отладчик «вопит» при каждом исключении ;)

                            Сообщение отредактировано: leo — 07.01.11, 15:39


                            Alexander N



                            Сообщ.
                            #14

                            ,
                            07.01.11, 16:59

                              Цитата leo @ 07.01.11, 15:38

                              но и всю систему в целом

                              Каким образом?


                              Демо



                              Сообщ.
                              #15

                              ,
                              07.01.11, 17:03

                                Установка флага Tools/Options/Debugger/Stop on Delphi exceptions в «on» нужна в очень редких случаях (таких даже не припомню).

                                Используется только для отладки.

                                Обработка исключений — необходимая и нормальная вещь внутри программы.
                                Получать же при отладке одно и то же исключение 2 раза — вовсе бессмысленно.

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

                                Сообщение отредактировано: Демо — 07.01.11, 17:05

                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                0 пользователей:

                                • Предыдущая тема
                                • Delphi: Общие вопросы
                                • Следующая тема

                                [ Script execution time: 0,0383 ]   [ 16 queries used ]   [ Generated: 12.06.23, 17:21 GMT ]  

                                IPB

                                > ВНИМАНИЕ!

                                > Отключение контроля ошибок, как отключить контроль ошибок в Delphi???

                                сообщение 18.02.2007 22:02

                                Сообщение
                                #1


                                Пионер
                                **

                                Группа: Пользователи
                                Сообщений: 58
                                Пол: Мужской
                                Реальное имя: Константин

                                Репутация: -  1  +



                                В паскале контроль ошибок отключается так: {-$I} как подобное, если это возможно сделать в делфи????

                                соррю, если уже обсуждалось…

                                 Оффлайн  Профиль  PM 

                                 К началу страницы 

                                + Ответить 

                                volvo

                                сообщение 18.02.2007 22:27

                                Сообщение
                                #2

                                Гость



                                А можно узнать, зачем тебе это понадобилось в Дельфи? Есть же

                                Try
                                // Делаешь что-то
                                Except
                                // Если произошла ошибка - придешь сюда, и обрабатывай ее
                                End;

                                 К началу страницы 

                                + Ответить 

                                priboltik

                                сообщение 19.02.2007 0:01

                                Сообщение
                                #3


                                Пионер
                                **

                                Группа: Пользователи
                                Сообщений: 58
                                Пол: Мужской
                                Реальное имя: Константин

                                Репутация: -  1  +



                                ок.. попробую так.. спасибо!!!!

                                 Оффлайн  Профиль  PM 

                                 К началу страницы 

                                + Ответить 

                                klem4

                                сообщение 19.02.2007 14:04

                                Сообщение
                                #4


                                Perl. Just code it!
                                ******

                                Группа: Пользователи
                                Сообщений: 4 100
                                Пол: Мужской
                                Реальное имя: Андрей

                                Репутация: -  44  +



                                Еще есть вариант обработки try..finally..end; отличается тем, что блок finally выполнится независимо от того возникла ли ошибка. Вообще прочитай про обработку исключительных ситуаций в Delphi, в любой книге должно быть.

                                ———————

                                perl -e ‘print for (map{chr(hex)}(«4861707079204E6577205965617221″=~/(.{2})/g)), «n»;’

                                 Оффлайн  Профиль  PM 

                                 К началу страницы 

                                + Ответить 

                                priboltik

                                сообщение 19.02.2007 16:20

                                Сообщение
                                #5


                                Пионер
                                **

                                Группа: Пользователи
                                Сообщений: 58
                                Пол: Мужской
                                Реальное имя: Константин

                                Репутация: -  1  +



                                ну вот например мне надо проверить существует ли файл кот. мы прописали в Edit1 ..
                                тогда это будет выглядеть примерно так:
                                try
                                Assignfile(f,edit1.text);
                                if ioresult=1 then
                                showMessage(‘Файл не найден’)
                                else
                                reset(f);
                                except

                                ???????
                                подскажите плиз…

                                 Оффлайн  Профиль  PM 

                                 К началу страницы 

                                + Ответить 

                                volvo

                                сообщение 19.02.2007 18:12

                                Сообщение
                                #6

                                Гость



                                Вот так это будет выглядеть:

                                try
                                Assignfile(f, edit1.text);
                                Reset(f);

                                // Продолжаем обработку файла - он успешно открыт

                                except
                                // ошибка при открытии файла - пришли сюда...
                                showMessage('Файл не найден');
                                end;

                                 К началу страницы 

                                + Ответить 

                                priboltik

                                сообщение 19.02.2007 20:47

                                Сообщение
                                #7


                                Пионер
                                **

                                Группа: Пользователи
                                Сообщений: 58
                                Пол: Мужской
                                Реальное имя: Константин

                                Репутация: -  1  +



                                ок.. теперь все понятно просто вгоняло в тупик то, что в самой среде при компилляции все равно ошибка выдается.. smile.gif

                                 Оффлайн  Профиль  PM 

                                 К началу страницы 

                                + Ответить 

                                1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)

                                Пользователей: 0

                                500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают

                                Связь с администрацией: bu_gen в домене octagram.name

                                Понравилась статья? Поделить с друзьями:
                              • Как отключить отображение ошибок в ворде
                              • Как отключить ошибки ssl сертификатов
                              • Как отключить отображение ошибок joomla
                              • Как отключить ошибки opengl в майнкрафт
                              • Как отключить оповещение об ошибке в windows