Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.03.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.003 c
2-1322552557
YURY
2011-11-29 11:42
2012.03.11
Потоки


2-1322663788
_qwerty_
2011-11-30 18:36
2012.03.11
организация работы с таблицами


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


15-1321134248
Кто б сомневался
2011-11-13 01:44
2012.03.11
Ктонить из форумчан хочет поиграть в Left4Dead2 или другие игры?


15-1321475403
Юрий
2011-11-17 00:30
2012.03.11
С днем рождения ! 17 ноября 2011 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский