Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.03.11;
Скачать: CL | DM;

Вниз

try except end;   Найти похожие ветки 

 
Vyacheslav   (2011-11-28 03:08) [0]

var n:integer;
...
try
n:=StrToInt("d");
except
end;

Выдаёт ошибку. Нужны какие-либо директивы компилятора?


 
Vyacheslav   (2011-11-28 03:09) [1]

Или может переписать свою StrToInt с использованием val?
Что вобщем посоветуете для безовпасного конверта?


 
KilkennyCat ©   (2011-11-28 04:29) [2]

StrToIntDef

и смысл использовать except без обработки?


 
Vyacheslav   (2011-11-28 04:33) [3]

Спасибо.
> и смысл использовать except без обработки?
n имела начальное значение. Обработка нужна, не спорю, я её пропустил дабы не нагромождать код примера.


 
KilkennyCat ©   (2011-11-28 05:36) [4]


> я её пропустил дабы не нагромождать код примера.

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


 
brother ©   (2011-11-28 06:51) [5]

> Выдаёт ошибку.

какую?


 
sniknik ©   (2011-11-28 08:18) [6]

> я её пропустил дабы не нагромождать код примера.
код примера должен быть реальным, что показано то и обсуждается, без исключений. если код большой и его нужно корректировать "под форум" то пишется тестовая программка где предварительно и проверяется именно "тот код", для форума, и обсуждается тогда все одно он, реальный код из реального примера.

по другому, вы фактически обманываете тех к кому как бы пришли за советом...


 
И. Павел ©   (2011-11-28 09:03) [7]

> [0] Vyacheslav   (28.11.11 03:08)

Еще есть функция TryStrToInf. Она возвращает false, если преобразование осуществить не удалось. Обычно в коде удобно ее использовать, если нужно обрабатывать ошибки преобразования и при этом не хочется, чтобы отладчик реагировал на каждую из них, но и не хочется отключать отслеживание этого типа ошибок вообще.
Если в блоке except у вас что-то есть, то удобно будет использовать TryStrToInt.


 
И. Павел ©   (2011-11-28 09:10) [8]

TryStrToInf —> TryStrToInt


 
Vyacheslav   (2011-11-28 17:04) [9]

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  
---------------------------

Всё же для полной ясности почему появляется ошибка? Как её избежать?


 
Anatoly Podgoretsky ©   (2011-11-28 17:05) [10]

> Vyacheslav  (28.11.2011 17:04:09)  [9]

Когда учиться начнешь?


 
Юрий Зотов ©   (2011-11-28 17:15) [11]

> Vyacheslav   (28.11.11 17:04) [9]

> почему появляется ошибка?

Потому что программа запущена из Delphi - под отладчиком. Если запустить сам EXE, то ошибки не будет.

> Как её избежать?

Никак не надо ее избегать. Можно, конечно, отключить реакцию отладчика на этот вид исключений, но лучше этого не делать.


 
DiamondShark ©   (2011-11-28 17:16) [12]


> Всё же для полной ясности почему появляется ошибка?

Потому что "d" не является целым числом.


> Как её избежать?

Передать строку, представляющую целое число. Например, "123".


 
DiamondShark ©   (2011-11-28 17:24) [13]


> Юрий Зотов ©   (28.11.11 17:15) [11]
> Потому что программа запущена из Delphi - под отладчиком.

Зачем вы обманываете?
В строке
  n:=StrToInt("d");
ошибка появляется вне зависимости от того, запущена ли программа под отладчиком, или нет.


>  Если запустить сам EXE, то ошибки не будет.

Ошибка будет.
Не будет диалога с сообщением.

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


 
Vyacheslav   (2011-11-28 17:28) [14]

Из всего списка KilkennyCat, И. Павел, Юрий Зотов повели себя адекватно. Остальные просто массовка амбиций.

Почему бы не удалить ветку «Начинающим», если никто более не в состоянии или не имеет желания ответить на вопрос, что ошибка выскакивает только под отладчиком? В примерах, что я нашёл в поисковых системах 90% просто перекопированы с одного источника и совершенно не упоминается о настройках или директивах компилятора для избежания этой ошибки в момент отладки.


 
Anatoly Podgoretsky ©   (2011-11-28 17:30) [15]


> Ошибка будет.
> Не будет диалога с сообщением.

Только речь про другую ошибку

> Debugger Exception Notification

При запуске ехе данной ошибки не будет


 
Vyacheslav   (2011-11-28 17:32) [16]

DiamondShark
Позвольте, вы так же и заказчикам обьясняете, что ошибка будет? Зачем такие дебри?!
В 90% случаев конверт из string в integer - "опасная" ситуация, которую надо обработать не прервав исполнение программы и обязательно получив подтверждение или опровержение успешности операции. Зачем нужно что-то ещё?


 
Anatoly Podgoretsky ©   (2011-11-28 17:34) [17]


> При запуске ехе данной ошибки не будет

И по коду ошибки рантайм тоже не будет.

>  except
>    n:=0;
>  end;

Другое дело что очень некрасиво, автора не красит. Но ему бы пусть хоть как, но работает.


 
Anatoly Podgoretsky ©   (2011-11-28 17:35) [18]

> Vyacheslav  (28.11.2011 17:32:16)  [16]

А где здесь опровержение, тут голову в песок


 
Vyacheslav   (2011-11-28 17:40) [19]

Anatoly Podgoretsky вы правы.
Я поэтому и отписал "Что вобщем посоветуете для безовпасного конверта?"
Ранее не знал о существовании:
StrToIntDef
TryStrToInt
Думал, что всё подобное делается с помошью
try
except
end;

>Другое дело что очень некрасиво, автора не красит. Но ему бы пусть хоть как, но работает.
Ну почему сразу хоть как!? Было бы "хоть как", то было бы просто - одна строка:
n:=StrToInt("d");


 
Anatoly Podgoretsky ©   (2011-11-28 17:41) [20]

> Vyacheslav  (28.11.2011 17:40:19)  [19]

Правильно, в данном случае TryStrToInt


 
Vyacheslav   (2011-11-28 17:42) [21]

Ох нет!
поправка:

* Ну почему сразу хоть как!? Было бы "хоть как", то было бы просто - одна строка:
* n:=StrToInt(s);


 
Vyacheslav   (2011-11-28 17:44) [22]

> Правильно, в данном случае TryStrToInt
Anatoly Podgoretsky
Cпасибо! Теперь всё ясно.


 
Юрий Зотов ©   (2011-11-28 19:03) [23]


> DiamondShark ©   (28.11.11 17:24) [13]

Вы гениально уточнили мой ответ. Большое Вам спасибо.

Все остальное Вам уже сказал автор вопроса. Добаить могу лишь одно: LOL!



Страницы: 1 вся ветка

Текущий архив: 2012.03.11;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.008 c
15-1319910376
KilkennyCat
2011-10-29 21:46
2012.03.11
налог на носители


15-1321122840
Максим
2011-11-12 22:34
2012.03.11
Что делать в случае если Windows уже не помещается на винте?


15-1322026771
И. Павел
2011-11-23 09:39
2012.03.11
Скиньте, пожалуйста, mc.exe


15-1321834443
иксик
2011-11-21 04:14
2012.03.11
А вот вы говорите автоваз


15-1321516927
CRLF
2011-11-17 12:02
2012.03.11
Цin7, Записки