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


Автор: Aleks26 9.11.2012, 14:30
Код

unit unSumTriNum1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label5: TLabel;
    procedure FormDblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TSumDvaNum = class
  public
  a, b: Integer;
  function GetResult : Integer; virtual;
  end;

  TSumTriNum = class(TSumDvaNum)
  public
  c: Integer;
  function GetResult : Integer; override;
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

 Function TSumDvaNum.GetResult : Integer;
 begin
 {Blok obrabotki isklucheniy 1}
  try
  a:=StrToInt(Form1.Edit1.Text);
  except
   if messageDlg('Neverno zadan perviy parametr!', mtError, [mbOk],0) = mrOK
   then Form1.Edit1.SetFocus;
  end;
  b:=StrToInt(Form1.Edit2.Text);
  Result := a+b;
 end;

 Function TSumTriNum.GetResult : Integer;
 begin
 {blok obrabotki isklucheniy 2}
  try
  a:=StrToInt(Form1.Edit1.Text);
  except
   if messageDlg('Neverno zadan perviy parametr!', mtError, [mbOk],0) = mrOK
   then Form1.Edit1.SetFocus;
  end;
  b:=StrToInt(Form1.Edit2.Text);
  c:=StrToInt(Form1.Edit3.Text);
  Result := a+b+c;
 end;

procedure TForm1.FormDblClick(Sender: TObject);
var
 sumnum: TSumDvaNum;
begin
 if Edit3.Text = '' then
  begin
   sumnum := TSumDvaNum.Create;
   Label5.Caption := IntToStr(sumnum.GetResult);
   sumnum.Free;
  end
 else
  begin
   sumnum := TSumTriNum.Create;
   Label5.Caption := IntToStr(sumnum.GetResult);
   sumnum.Free;
  end;
 end;

end.


Имею элементарную программу с двумя классами и переопределенными методами. Вроде бы проблем нет. Но, если я оставляю пустым поле Edit1, то почему сразу не выполняется блок except: сначала идет стандартное сообщение Delphi об ошибке и только потом, после обращения к FormDblClick? Подскажите, кто-нибудь, как организовать блок обработки исключений, чтобы эти действия, находящиеся в части except выполнялись сразу?  smile 

Автор: bems 9.11.2012, 15:00
они выполняются сразу, с точки зрения программы.
а перехват исключений отладчиком можно отключить в самой среде

Автор: Aleks26 9.11.2012, 17:50
Цитата(bems @  9.11.2012,  15:00 Найти цитируемый пост)
они выполняются сразу, с точки зрения программы.
а перехват исключений отладчиком можно отключить в самой среде

Большое спасибо.  smile 

Автор: superVad 9.11.2012, 20:08
Цитата(Aleks26 @  9.11.2012,  13:30 Найти цитируемый пост)
Но, если я оставляю пустым поле Edit1, то почему сразу не выполняется блок except: сначала идет стандартное сообщение Delphi об ошибке и только потом, после обращения к FormDblClick?

Если запускать программу не через Делфи - то все будет норм.

Цитата(bems @  9.11.2012,  14:00 Найти цитируемый пост)
а перехват исключений отладчиком можно отключить в самой среде

Наверное, все таки - не надо этого делать.

Автор: bems 9.11.2012, 20:44
Цитата(superVad @  9.11.2012,  20:08 Найти цитируемый пост)
Наверное, все таки - не надо этого делать. 

делается отдельно для разных классов, так что вполне можно себе позволить

Автор: northener 9.11.2012, 23:57
Цитата(superVad @  9.11.2012,  20:08 Найти цитируемый пост)
Наверное, все таки - не надо этого делать. 

В целом не надо, но иногда очень нужно при отладке. Например если нормально обработанное исключение может возникать многократно при отладке данного фрагмента программы. 

Автор: bems 10.11.2012, 12:44
вообще, если в программе нигде нет мест, где глушатся все исключения подряд, то можно делать и наоборот - выключить перехват дебагером, и включать только если где-то возникает непредусмотренное исключение

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