![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
try except end; [D7, 2003]
Vyacheslav © (2011-11-28 03:08:00)var n:integer;
...
try
n:=StrToInt('d');
except
end;
Выдаёт ошибку. Нужны какие-либо директивы компилятора?
Юрий Зотов (2011-11-28 19:03:00) [1]
> DiamondShark © (28.11.11 17:24) [13]
Вы гениально уточнили мой ответ. Большое Вам спасибо.
Все остальное Вам уже сказал автор вопроса. Добаить могу лишь одно: LOL!
Vyacheslav (2011-11-28 17:44:00) [2]> Правильно, в данном случае TryStrToInt
Anatoly Podgoretsky
Cпасибо! Теперь всё ясно.
Vyacheslav (2011-11-28 17:42:00) [3]Ох нет!
поправка:
* Ну почему сразу хоть как!? Было бы "хоть как", то было бы просто - одна строка:
* n:=StrToInt(s);
Anatoly Podgoretsky (2011-11-28 17:41:00) [4]> Vyacheslav (28.11.2011 17:40:19) [19]
Правильно, в данном случае TryStrToInt
Vyacheslav (2011-11-28 17:40:00) [5]Anatoly Podgoretskyвы правы.
Я поэтому и отписал "Что вобщем посоветуете для безовпасного конверта?"
Ранее не знал о существовании:
StrToIntDef
TryStrToInt
Думал, что всё подобное делается с помошью
try
except
end;
>Другое дело что очень некрасиво, автора не красит. Но ему бы пусть хоть как, но работает.
Ну почему сразу хоть как!? Было бы "хоть как", то было бы просто - одна строка:
n:=StrToInt('d');
Anatoly Podgoretsky (2011-11-28 17:35:00) [6]> Vyacheslav (28.11.2011 17:32:16) [16]
А где здесь опровержение, тут голову в песок
Anatoly Podgoretsky (2011-11-28 17:34:00) [7]
> При запуске ехе данной ошибки не будет
И по коду ошибки рантайм тоже не будет.
> except
> n:=0;
> end;
Другое дело что очень некрасиво, автора не красит. Но ему бы пусть хоть как, но работает.
Vyacheslav (2011-11-28 17:32:00) [8]DiamondShark
Позвольте, вы так же и заказчикам обьясняете, что ошибка будет? Зачем такие дебри?!
В 90% случаев конверт из string в integer - "опасная" ситуация, которую надо обработать не прервав исполнение программы и обязательно получив подтверждение или опровержение успешности операции. Зачем нужно что-то ещё?
Anatoly Podgoretsky (2011-11-28 17:30:00) [9]
> Ошибка будет.
> Не будет диалога с сообщением.
Только речь про другую ошибку
> Debugger Exception Notification
При запуске ехе данной ошибки не будет
Vyacheslav (2011-11-28 17:28:00) [10]Из всего списка KilkennyCat, И. Павел, Юрий Зотовповели себя адекватно. Остальные просто массовка амбиций.
Почему бы не удалить ветку «Начинающим», если никто более не в состоянии или не имеет желания ответить на вопрос, что ошибка выскакивает только под отладчиком? В примерах, что я нашёл в поисковых системах 90% просто перекопированы с одного источника и совершенно не упоминается о настройках или директивах компилятора для избежания этой ошибки в момент отладки.
DiamondShark (2011-11-28 17:24:00) [11]
> Юрий Зотов © (28.11.11 17:15) [11]
> Потому что программа запущена из Delphi - под отладчиком.
Зачем вы обманываете?
В строке
n:=StrToInt('d');
ошибка появляется вне зависимости от того, запущена ли программа под отладчиком, или нет.
> Если запустить сам EXE, то ошибки не будет.
Ошибка будет.
Не будет диалога с сообщением.
Вы оказываете медвежью услугу, отвечая не на тот вопрос, который вас спросили.
Именно из-за таких услужливых телепатов плодяться верующие в то, что except "устраняет ошибки".
DiamondShark (2011-11-28 17:16:00) [12]
> Всё же для полной ясности почему появляется ошибка?
Потому что 'd' не является целым числом.
> Как её избежать?
Передать строку, представляющую целое число. Например, '123'.
Юрий Зотов (2011-11-28 17:15:00) [13]> Vyacheslav (28.11.11 17:04) [9]
> почему появляется ошибка?
Потому что программа запущена из Delphi - под отладчиком. Если запустить сам EXE, то ошибки не будет.
> Как её избежать?
Никак не надо ее избегать. Можно, конечно, отключить реакцию отладчика на этот вид исключений, но лучше этого не делать.
Anatoly Podgoretsky (2011-11-28 17:05:00) [14]> Vyacheslav (28.11.2011 17:04:09) [9]
Когда учиться начнешь?
Vyacheslav (2011-11-28 17:04:00) [15]StrToIntDef
TryStrToInt
отличные интструменты!
Вот полный код проекта:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var n:integer;
begin
try
n:=StrToInt('d');
except
n:=0;
end;
end;
end.
При нажатии Button1 вылетает следующая ошибка:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EConvertError with message ''d' is not a valid integer value'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Всё же для полной ясности почему появляется ошибка? Как её избежать?
И. Павел (2011-11-28 09:10:00) [16]TryStrToInf > TryStrToInt
И. Павел (2011-11-28 09:03:00) [17]> [0] Vyacheslav (28.11.11 03:08)
Еще есть функция TryStrToInf. Она возвращает false, если преобразование осуществить не удалось. Обычно в коде удобно ее использовать, если нужно обрабатывать ошибки преобразования и при этом не хочется, чтобы отладчик реагировал на каждую из них, но и не хочется отключать отслеживание этого типа ошибок вообще.
Если в блоке except у вас что-то есть, то удобно будет использовать TryStrToInt.
sniknik (2011-11-28 08:18:00) [18]> я её пропустил дабы не нагромождать код примера.
код примера должен быть реальным, что показано то и обсуждается, без исключений. если код большой и его нужно корректировать "под форум" то пишется тестовая программка где предварительно и проверяется именно "тот код", для форума, и обсуждается тогда все одно он, реальный код из реального примера.
по другому, вы фактически обманываете тех к кому как бы пришли за советом...
brother (2011-11-28 06:51:00) [19]> Выдаёт ошибку.
какую?
KilkennyCat (2011-11-28 05:36:00) [20]
> я её пропустил дабы не нагромождать код примера.
ну и в результате ты показал в примере, что отдал ошибку на обработку кому угодно, но только не себе.