Главная страница
    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.004 c
2-1322561090
Evgen88
2011-11-29 14:04
2012.03.11
помогите разобраться с TEdit


15-1321220394
KilkennyCat
2011-11-14 01:39
2012.03.11
TCanvas & HTML


15-1321734602
Юрий
2011-11-20 00:30
2012.03.11
С днем рождения ! 20 ноября 2011 воскресенье


15-1321561802
Юрий
2011-11-18 00:30
2012.03.11
С днем рождения ! 18 ноября 2011 пятница


2-1322552557
YURY
2011-11-29 11:42
2012.03.11
Потоки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский