Как исправить обработку EConvertError в Delphi 7? - PullRequest
1 голос
/ 10 января 2020

, поэтому я попытался сделать простое приложение, чтобы проверить, является ли введенный номер нечетным или четным. Также я хотел обработать EConvertError, введя Try and Except.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  var x:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
try
  x:=StrToInt(InputBox('Zadávanie','Napíš číslo',''));
  if x mod 2 = 0 then ShowMessage('Zadané číslo je párne')
  else ShowMessage('Zadané číslo je nepárne');
except
on E: EConvertError do
    ShowMessage('Zadávaj len čísla!');
end;
end;
end.

Но это не работает и все еще показывает, что точно такой же Project1.exe поднял класс исключения EConvertError с сообщением '' 'не является целочисленное значение vaild вместо 'Zadávaj len čísla!'. Почему?

Ответы [ 2 ]

4 голосов
/ 10 января 2020

Ваш код try..except в порядке.

Вы просто испытываете, что происходит, когда вы запускаете свое приложение в отладчике IDE. Отладчик видит исключение раньше, чем ваше приложение. Вы видите всплывающее сообщение от отладчика. Просто отклоните всплывающее окно и либо нажмите кнопку «Выполнить» в IDE, либо нажмите клавишу F9 на клавиатуре, чтобы продолжить выполнение, и исключение будет передано в ваше приложение для нормальной обработки, вызывая ваш блок except. Всплывающее окно не будет появляться, когда вы запускаете свое приложение вне отладчика, просто будет вызван except.

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

Или вы можете просто использовать TryStrToInt() вместо StrToInt(). TryStrToInt() не вызывает исключение при ошибке преобразования.

3 голосов
/ 10 января 2020

Просто используйте TryStrToInt(), который возвращает false, если на входе не было допустимого целого числа, что-то вроде этого:

procedure TForm1.FormCreate(Sender: TObject);
var x: integer;
begin
try
  if not TryStrToInt(InputBox('Zadávanie','Napíš číslo',''),x) then begin
    ShowMessage('Zadávaj len čísla!');
    exit;
  end;
  if x mod 2 = 0 then ShowMessage('Zadané číslo je párne')
  else ShowMessage('Zadané číslo je nepárne');
end;

Так что исключение не возникнет при ошибке ввода.

ИМХО исключения должны быть исключительными - мне совсем не нравится использовать EConvertError в моем коде.

Кстати, не очень хорошая идея помещать некоторый код пользовательского интерфейса в OnCreate event - лучше использовать OnShow для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...