Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/125: Рейтинг темы: голосов - 125, средняя оценка - 4.94
KinD
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 23
#1

Каков принцип работы и общее назначение конструкции try - catch

03.06.2012, 01:19. Просмотров 22504. Ответов 15
Метки нет (Все метки)

Приветствую.
Расскажите пожалуйста о try and catch.
Я читал на MSDN... но там как то не понятно написано.
Может быть я не правильно понял, но как мне показалось, то он как if-else?
А если смотреть на весь шарп, то там названия "говорящие" тот же if-else... вот я и думаю, что try(попробовать) а catch(ловить, поймать).
Про синтаксис можно и не объяснять... там я с примеров могу взять без проблем с того же MSDN...
А вот как он именно работает... там к примеру условие какое у него.. с какими типами переменных работает и тп... только прошу "человеческими" словами, а то я ещё не много знаю о c#, и каждый раз в гугль лезть не хочется, хотя дело ваше.
Просто прошу помочь разъяснить для чего он вообще нужен и как работает.
Надеюсь на понимание. Заранее благодарю.

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2012, 01:19
Ответы с готовыми решениями:

Каков принцип работы атрибутов
Всем доброго времени суток. Объясните пожалуйста принцип работы атрибутов. То...

Каков принцип работы самого простого web crawler?
Здравствуйте! Каков принцип работы самого простого web crawler? В Интернете...

Стек: назначение и принцип работы. Примеры использования
Стек - структура данных, в которой доступ к элементам организован по принципу...

Каков принцип работы клиент-серверного приложения
Структура прилажения такая: Клиент весит и ждет пока сервер пришлет текст,...

На сколько оправдано использование конструкции try - catch
Все привет. Вот разбираюсь с кодом,который не так давно написал. И с ужасом...

15
kolorotur
Эксперт .NET
10006 / 8404 / 2062
Регистрация: 17.09.2011
Сообщений: 14,466
03.06.2012, 01:30 #2
Блоки try/catch используются для обработки исключительных ситуаций, возникших при выполнении некого кода.
Блоком try помечается код, который нужно "мониторить" на предмет исключений. Если в коде, помеченном блоком try возникает исключительная ситуация, то выполнение кода мгновенно переходит на блок catch, в котором предположительно проходит обработка этой ситуации.
Если какой-то участок кода создает исключительную ситуацию путем бросания (ключевое слово throw) экземпляра класса , унаследованого от класса Exception (или сам Exception), но при этом отсутствует "ловящий" его блок catch, то исключение летит дальше по стеку, то есть в вызывающий метод. Если и там нет блока catch, то исключение летит дальше. Если во всем стеке вызовов нет ни единого блока catch, то программа крашится.

Сама суть исключений в том, что в какой-то момент программа может перейти в такое состояние, при котором текущий метод не может адекватно продолжать свою работу, тем самым мгновенно прерываясь и сообщая вызвавшему его методу о проблеме. Проблема описывается классом Exception или любым другим, унаследованным от него.

Как-то так.
6
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.06.2012, 01:33 #3
Цитата Сообщение от kolorotur Посмотреть сообщение
Блоки try/catch используются для обработки исключительных ситуаций, возникших при выполнении некого кода.
Блоком try помечается код, который нужно "мониторить" на предмет исключений. Если в коде, помеченном блоком try возникает исключительная ситуация, то выполнение кода мгновенно переходит на блок catch, в котором предположительно проходит обработка этой ситуации.
Если какой-то участок кода создает исключительную ситуацию путем бросания (ключевое слово throw) экземпляра класса , унаследованого от класса Exception (или сам Exception), но при этом отсутствует "ловящий" его блок catch, то исключение летит дальше по стеку, то есть в вызывающий метод. Если и там нет блока catch, то исключение летит дальше. Если во всем стеке вызовов нет ни единого блока catch, то программа крашится.

Сама суть исключений в том, что в какой-то момент программа может перейти в такое состояние, при котором текущий метод не может адекватно продолжать свою работу, тем самым мгновенно прерываясь и сообщая вызвавшему его методу о проблеме. Проблема описывается классом Exception или любым другим, унаследованным от него.

Как-то так.
- мама, а что такое микроб?
- это такая бактерия ...
0
kolorotur
Эксперт .NET
10006 / 8404 / 2062
Регистрация: 17.09.2011
Сообщений: 14,466
03.06.2012, 01:36 #4
novi4ok, если вам что-то не понятно по тексту, то вы лучше задавайте уточняющие вопросы - мне ответить не сложно.
А острить лучше со сверстниками в песочнице - они это больше оценят.

С уважением.
2
KinD
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 23
03.06.2012, 01:40  [ТС] #5
Добавлено через 57 секунд
novi4ok, всё норм вроде объяснили мне Всё хорошо вроде как... сейчас только скажут... правильно ли я понял или нет...
====
Вот пример из моей прошло темы, от buntar:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string temp = Console.ReadLine();
bool fl = false;
bool fl1 = false;
 
try { Console.WriteLine(Convert.ToInt16(temp).GetType()); fl = true; }
catch { Console.WriteLine("is not Int"); }
 
if (!fl)
{
  try { Console.WriteLine(Convert.ToDouble(temp).GetType()); fl1 = true; }
  catch { Console.WriteLine("is not Double"); }
 
  if (!fl1)
  {
    try { Console.WriteLine(Convert.ToString(temp).GetType()); }
    catch { Console.WriteLine("is not String"); }
   }
}
Console.ReadLine();
Получается, что он создал две переменные и включил их в try... но в try они никогда не будут "правдивы"... соответственно будет всегда выполнятся первое условие и он одновременно пробует преобразовать данные с одного типа в другой, если одно выполнилось, то уже другие не пробует(через if)... так получается?
0
SergioDnDz
24 / 24 / 8
Регистрация: 27.02.2010
Сообщений: 74
03.06.2012, 01:48 #6
простыми словами в блоке try - код в котором могут произойти ошибки во время выполнения, а в блоке catch - что делать если возникнет ошибка в блоке try
4
kolorotur
Эксперт .NET
10006 / 8404 / 2062
Регистрация: 17.09.2011
Сообщений: 14,466
03.06.2012, 01:50 #7
Цитата Сообщение от KinD Посмотреть сообщение
Получается он записал, что fl1 и fl никогда не будут правдивы
На примере fl.

Итак, имеется блок try:
C#
1
2
3
4
5
try 
{ 
   Console.WriteLine(Convert.ToInt16(temp).GetType()); 
   fl = true; 
}
Если в этом блоке что-то пойдет "не так", то выполнение кода сразу же перепрыгнет на ближайший блок catch.
В данном случае что-то может пойти "не так", если строку, на которую ссылается переменная temp, по какой-либо причине невозможно переконвертировать в целое число. Например, если строка имеет вид "Превед, медвед!". Как из этой фразы сделать число? Никак, то есть произойдет ошибка конвертирования и выполнение сразу перепрыгнет сюда:
C#
1
catch { Console.WriteLine("is not Int"); }
То есть строчка fl = true не будет выполнена, значит fl останется false.

Если же на вход дается "нормальная" строка, например "42", то ее вполне можно перевести в целое. Ошибки не возникнет, выполнение перейдет на строчку fl = true, а вот блок catch выполнен не будет, так как ошибки не возникло.

То есть если возникла ошибка, то fl = false (присвоения true просто не произошло - программа туда "не дошла"), а если ошибки не возникло, то fl = true.

То же самое и с остальными переменными.

Цитата Сообщение от KinD Посмотреть сообщение
Получается что я в try записываю несколько условий.
Не обязательно условия. В блоке try может быть абсолютно любой участок кода.
C#
1
2
3
4
5
6
7
8
try
{
   Console.WriteLine("Превед!");
}
catch
{
   Console.WriteLine("Произошла какая-то НЁХ!");
}
2
SergioDnDz
24 / 24 / 8
Регистрация: 27.02.2010
Сообщений: 74
03.06.2012, 01:56 #8
Сложно для него будет))

к примеру тебе нужно ввести число типа byte c консоли, а ты вводишь строку:

в блоке try возникнет ошибка следовательно компилятор перейдет в блок catch
если в try ошибки не возникает - блок catch игнорируется

C#
1
2
3
4
5
6
7
8
try
{
byte b=Convert.ToByte(Console.ReadLine());
}
catch
{
Console.WriteLine("Вводите корректно!");
}
2
kolorotur
Эксперт .NET
10006 / 8404 / 2062
Регистрация: 17.09.2011
Сообщений: 14,466
03.06.2012, 02:02 #9
Цитата Сообщение от SergioDnDz Посмотреть сообщение
Сложно для него будет
Сложновато по одному сообщению судить об уровне знаний
По ходу будет задавать вопросы о непонятном - там и найдем "общий язык".

Цитата Сообщение от SergioDnDz Посмотреть сообщение
в блоке try возникнет ошибка следовательно компилятор перейдет в блок catch
С вашего позволения, немного поправлю: исключения возникают не на стадии компиляции, потому компилятор никуда не пойдет
1
KinD
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 23
03.06.2012, 11:31  [ТС] #10
kolorotur, всё понятно...сейчас попробую-ка приделать этот оператор к своей "притивной" консольке...покажу, правильно ли я сделал или нет...

Добавлено через 26 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
double first;
            string name;
            Console.WriteLine("Здравствуйте. Представьтесь, пожалуйста");
            name = Console.ReadLine();
            Console.WriteLine("Спасибо! Добро пожаловать, {0}!", name);
            begin1: 
            Console.WriteLine("Введите число:");
            try
            {
            double.TryParse(Console.ReadLine(), out first);
            Console.WriteLine("Это число");
            }
            catch
            {
                Console.WriteLine("Это не число");
                goto begin1;
            }
            Console.Write("Хотите выйти? (y/n)");
            string one = Console.ReadLine();
            try
            {
                Console.WriteLine("{0}", one);
                if (one == "y")
                {
                    Console.WriteLine("Удачи");
                    Console.ReadKey();
                }
                else
                {
                    Console.WriteLine("Вы хотите дальше работать? (да/нет) ответьте словами");
                    string sec = Console.ReadLine();
                    if (sec == "да")
                    {
                        goto begin1;
                    }
                    else
                    {
                        Console.ReadKey();
                    }
 
                }
 
            }
            catch
            {
                Console.WriteLine("Продолжайте работать");
                goto begin1;
            }
            Console.ReadKey();
Вот что я получил... используя try and catch.
Код за основу брался вот от сюда: Определение типа введенных данных (символ, число)
По тем условиям, что я поставил в try, то никогда не дойдёт "очередь" до выполнения cathc, ибо я всё "просчитал" с помощью if-else

Добавлено через 1 минуту
Вот только "регистрозависимость" не понял как победить.
Там где ответ нужен "да" или "нет", когда ставишь "Да"(с большой буквы), то всё... капец.. выход
0
kolorotur
Эксперт .NET
10006 / 8404 / 2062
Регистрация: 17.09.2011
Сообщений: 14,466
03.06.2012, 11:44 #11
Цитата Сообщение от KinD Посмотреть сообщение
По тем условиям, что я поставил в try, то никогда не дойдёт "очередь" до выполнения cathc, ибо я всё "просчитал" с помощью if-else
Дойдет, если произойдет какая-то ошибка во время чтения из консоли или вывода в нее текста.
Что, конечно, весьма маловероятно при нормальных условиях выполнения.

Но даже если вы сделаете такой код:
C#
1
2
3
4
5
6
7
try
{
}
catch
{
   Console.WriteLine("Превед!");
}
то "очередь" до блока catch так же никогда не дойдет.

Цитата Сообщение от KinD Посмотреть сообщение
Вот только "регистрозависимость" не понял как победить.
C#
1
if (sec.ToLower() == "да")
1
KinD
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 23
03.06.2012, 12:09  [ТС] #12
Цитата Сообщение от kolorotur Посмотреть сообщение
C#
1
if (sec.ToLower() == "да")
Благодарен.
Вечерком ещё посижу на try and catch...А пока ещё об учёбе школьной надо подумать.
Спасибо вам, kolorotur, что не поленились и рассказали об этом операторе мне
Если не сложно... опишите в каких случаях используется finally, throw, exception... А то я не понял про них немного
0
tezaurismosis
Администратор
Эксперт .NET
8423 / 3790 / 723
Регистрация: 17.04.2012
Сообщений: 8,478
Записей в блоге: 14
03.06.2012, 14:03 #13
Внесу свои пять копеек
Цитата Сообщение от KinD Посмотреть сообщение
опишите в каких случаях используется finally, throw
блок finally будет практически гарантированно исполнен после блока try-catch. Это используется, к примеру, для освобождения ресурсов - закрытия файла, соединения с базой данных и т.п.
Пример из книги Бена Ватсона "C# 4.0 How To"
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
StreamWriter stream = null;
try {
    stream = File.CreateText("C:\\Temporary.txt");
    stream.Write(null, -1, 1);
} catch (ArgumentNullException) {
    Console.WriteLine("ОШИБКА!!");
}
finally {
    Console.WriteLine("В блоке finally закроем файл");
    if (stream != null) {
        stream.Close();
    }
}
throw используется для возбуждения исключения (класс, производный от System.Exception):
C#
1
throw new ArgumentOutOfRangeException();
(возбуждает исключение ArgumentOutOfRangeException)
1
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.06.2012, 16:37 #14
Цитата Сообщение от kolorotur Посмотреть сообщение
novi4ok, если вам что-то не понятно по тексту, то вы лучше задавайте уточняющие вопросы - мне ответить не сложно.
А острить лучше со сверстниками в песочнице - они это больше оценят.

С уважением.
объясни человеку на понятном ему языке. если бы он мог понять твое объяснение, он бы не задавал этого вопроса.
0
KinD
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 23
03.06.2012, 17:10  [ТС] #15
novi4ok, давайте вы не будете тут устраивать флудилку? Всё что мне не понятно - я спрашиваю. Пока процесс "освоения" этого оператора идёт нормальными темпами Не всё сразу, я не гений-программист. Всё нормально объясняют...
0
РомаМ
0 / 0 / 2
Регистрация: 08.07.2013
Сообщений: 56
02.04.2014, 10:33 #16
не пробовал написать
C#
1
sec.ToLower() == "да"
?? Может поможет? Я сам не профи, а под рукой визуал студио нету.... хммм, так спешил помочь человеку, тем что знаю, что не посмотрел на то, что ответ уже дали )))
0
02.04.2014, 10:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2014, 10:33

Ключевые слова get и set: каков в них смысл и назначение
Поясните, я правильно понимаю, что эта конструкция помогает строго определить,...

GZipstream - каков принцип многопоточного сжатия/распаковки?
Добрый день! Интересует тема сходная с...

Финализатор и локальные переменные, каков принцип "мусорщика" шарпа
Доброго времени. Сегодня экспериментировал с деструктором (финализатором)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru