Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Чипс
9 / 10 / 1
Регистрация: 21.08.2015
Сообщений: 233
#1

Обработка исключительных ситуаций - C#

16.10.2017, 12:35. Просмотров 204. Ответов 13
Метки нет (Все метки)

Добрый день.
Помоги разобраться с обработкой исключительных ситуаций.
Вот я написал класс «TxtFile», который будет открывать какой-то TXT файл, где я должен перехватывать исключение, в случаи если методу «DoOpen» класса «TxtFile» не удастся открыть файл по указанному пути?
Непосредственно в нутрии класса «TxtFile» или в блоке метода «Main»?

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
using System.IO;
 
namespace Cisco_for_ccna.Exceptions
{
    class go_go
    {
        public static void Main()
        {
            string PathToFile = "C:\\test\\ImportantDocument.txt";
 
            TxtFile ImportantTxtDocument = new TxtFile();
 
            ImportantTxtDocument.DoOpen(PathToFile);
        }
    }
    class TxtFile
    {
        private FileStream _txtDocument;
 
        public void DoOpen(string PathToFile)
        {
             _txtDocument = File.Open(PathToFile, FileMode.Open);
        }
    }
}
Вопрос на засыпку.
Ничего страшного если у меня в методе "Main" и методе "DoOpen" одинаково называются переменные "PathToFile"?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2017, 12:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обработка исключительных ситуаций (C#):

Обработка исключительных ситуаций
Помогите пожалуйста! задачка вроде бы не сложная по C#, но я на ней...

Обработка исключительных ситуаций
Реализовать обработку ошибок для лабораторной работы, при этом переопределив...

Обработка исключительных ситуаций
Вычислить значение Y, используя операторы для обработки исключительных...

Обработка исключительных ситуаций
решить в консольном режиме: Вычислить значение Y, используя операторы для...

Обработка исключительных ситуаций
Хочу сделать проверку на формат, в случае неверного формата вводимых данных -...

Обработка исключительных ситуаций (overflow)
помогите. Опишите функцию умножения двух целых, обработайте ошибку...

13
Kotyara0live
16 / 16 / 21
Регистрация: 23.02.2016
Сообщений: 307
Завершенные тесты: 8
16.10.2017, 12:44 #2
По логике нечего не измениться особо , просто если обернешь в мейн то будет ловиться исключение с всего метода DoOpen а вот если обернешь
C#
1
_txtDocument = File.Open(PathToFile, FileMode.Open);
то будет ловить только в этой строке
могу ошибаться )
0
woldemas
347 / 248 / 153
Регистрация: 06.09.2013
Сообщений: 795
16.10.2017, 12:55 #3
Чипс, а где вы собираетесь его обрабатывать, там и перехватывайте.
0
Чипс
9 / 10 / 1
Регистрация: 21.08.2015
Сообщений: 233
16.10.2017, 13:26  [ТС] #4
Цитата Сообщение от woldemas Посмотреть сообщение
а где вы собираетесь его обрабатывать, там и перехватывайте.
А где его будет правильно перехватывать?
0
Kotyara0live
16 / 16 / 21
Регистрация: 23.02.2016
Сообщений: 307
Завершенные тесты: 8
16.10.2017, 13:28 #5
Ну вот же
Цитата Сообщение от Kotyara0live Посмотреть сообщение
По логике нечего не измениться особо , просто если обернешь в мейн то будет ловиться исключение с всего метода DoOpen а вот если обернешь
C#
1
_txtDocument = File.Open(PathToFile, FileMode.Open);
то будет ловить только в этой строке
могу ошибаться )
0
woldemas
347 / 248 / 153
Регистрация: 06.09.2013
Сообщений: 795
16.10.2017, 13:32 #6
Чипс, так это от логики работы зависит, может вы хотите по умолчанию другой документ подсунуть (например, заранее заготовленный текст, вместо несуществующего файла), тогда в методе вашего класса TxtFile. А если хотите заново запросить имя файла, тогда лучше в Main.
По крайней мере, я так считаю, могу и ошибаться.
0
Чипс
9 / 10 / 1
Регистрация: 21.08.2015
Сообщений: 233
16.10.2017, 13:51  [ТС] #7
Хорошо, допустим я хочу сделать перехват исключений в самом классе

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
using System;
using System.IO;
 
namespace Cisco_for_ccna.Exceptions
{
    class go_go
    {
        public static void Main()
        {
            string PathToFile = "C:\\test\\ImportantDocument.txt";
 
            TxtFile ImportantTxtDocument = new TxtFile();
 
            ImportantTxtDocument.DoOpen(PathToFile);
 
            Console.WriteLine("Ready!");
            Console.ReadKey();
        }
    }
    class TxtFile
    {
        private FileStream _txtDocument;
 
        public void DoOpen(string PathToFile)
        {
            try
            {
                _txtDocument = File.Open(PathToFile, FileMode.Open);
            }
            catch
            {
                Console.WriteLine("Открыть файл не удалосль!");
            }
        }
    }
}
Теперь в случаи не открытия файла на экран будет выводиться сообщение, но так как я хочу сделать класс универсальным, ну и скажем, использовать его при разработки другого приложения к примеру "Приложение WPF", тогда у меня возникает проблема с сообщением "Console.WriteLine("Открыть файл не удалосль!");" Так как в WPF лучше не выводить в консоль, но при этом я хочу, чтобы сообщение осталось, как я должен поступать в таких случаях?
Не переписывать же вывод на экран в "универсальном классе".
0
gnomello
22 / 25 / 8
Регистрация: 17.09.2017
Сообщений: 60
Завершенные тесты: 1
16.10.2017, 13:55 #8
Цитата Сообщение от Чипс Посмотреть сообщение
Вопрос на засыпку.
Ничего страшного если у меня в методе "Main" и методе "DoOpen" одинаково называются переменные "PathToFile"?
ничего страшного, эти переменные относятся к разным методам и не пересекаются

Добавлено через 1 минуту
А ты возвращай из метода строку с текстом ошибки, а не делай вывод в консоль
1
Kotyara0live
16 / 16 / 21
Регистрация: 23.02.2016
Сообщений: 307
Завершенные тесты: 8
16.10.2017, 14:03 #9
ну либо оберни весь код и ищи FileNotFoundException
а там уже что хочешь делай
0
Чипс
9 / 10 / 1
Регистрация: 21.08.2015
Сообщений: 233
16.10.2017, 14:16  [ТС] #10
Цитата Сообщение от gnomello Посмотреть сообщение
А ты возвращай из метода строку с текстом ошибки
А как я могу это сделать?
Если вас не затруднит, напишите пример.
0
jr_
126 / 127 / 52
Регистрация: 14.06.2016
Сообщений: 431
Завершенные тесты: 5
16.10.2017, 14:53 #11
Цитата Сообщение от gnomello Посмотреть сообщение
А ты возвращай из метода строку с текстом ошибки, а не делай вывод в консоль
научите сейчас человека
а если метод должен что то возвращать, что делать ? через out ? а если таких методов вызывается десяток и все цепочкой ?

если нужно уведомить кого то, что что то пошло не так - обрабатывайте исключение именно в презентующем слое.
C#
1
2
3
4
5
6
7
8
while (true) {
  try {
    ImportantTxtDocument.DoOpen(PathToFile);
  }
  catch (Exception ex) {
    Console.WriteLine(ex.Message);
  }
}
аналогично для какого то GUI приложения
C#
1
2
3
4
5
6
try {
  ImportantTxtDocument.DoOpen(PathToFile);
}
catch (Exception ex) {
  MessageBox.Show(ex.Message);
}
а вообще не совсем понял, на кой городить свои "универсальные классы" на основе уже существующих?
0
Чипс
9 / 10 / 1
Регистрация: 21.08.2015
Сообщений: 233
16.10.2017, 15:10  [ТС] #12
Цитата Сообщение от jr_ Посмотреть сообщение
обрабатывайте исключение именно в презентующем слое.
Тобишь, я должен писать обработчики исключений в "Командах", а не в самих классах?
И еще вопрос, если я захочу написать к методу "DoOpen" Unit test, я также буду обрабатывать ошибки в самом Unit test?

Цитата Сообщение от jr_ Посмотреть сообщение
на кой городить свои "универсальные классы"
Этот класс для примера, чтобы долго не объяснять чего я делаю и чего именно хочу, поэтому и не понятно.
Проще написать, что я хочу открыть какой-то файл.
А так, конечно да, переписывать уже существующее не стоит.
0
jr_
126 / 127 / 52
Регистрация: 14.06.2016
Сообщений: 431
Завершенные тесты: 5
16.10.2017, 16:56 #13
Лучший ответ Сообщение было отмечено Чипс как решение

Решение

Цитата Сообщение от Чипс Посмотреть сообщение
Тобишь, я должен писать обработчики исключений в "Командах", а не в самих классах?
обрабатывать исключения нужно так, как требуется и там, где требуется.
если нужно вывести какое то сообщение - то соотвествующую обработку надо делать в ui слое.
если это часть логики - обрабатывать там же.
набросал очень грубый пример
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Stream OpenAny(params string[] files) {
    for (int i = 0; i < files.Length; i++) {
        try {
            return File.OpenRead(files[i]);
        }
        catch (FileNotFoundException) {
            // может быть какая то дополнительная логика
            // например, сменим расширение и попробуем заного
            if (Path.GetExtension(files[i]) == ".jpg") {
                files[i] = files[i].Replace(".jpg", ".jpeg");
                i -= 1;
            }
        }
        // остальные не пойманые исключения
        // будем считать фатальными для операции
        // первое случившееся будет выброшено наружу
        // а снаружи, уведомим пользователя и запишем в лог 
    }
 
    // не судьба
    throw new Exception("Не получилось открыть ни один файл");
}
1
Чипс
9 / 10 / 1
Регистрация: 21.08.2015
Сообщений: 233
16.10.2017, 20:21  [ТС] #14
Спасибо за разъяснения.
0
16.10.2017, 20:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2017, 20:21
Привет! Вот еще темы с решениями:

Обработка исключительных ситуаций underflow
помогите. Опишите функцию деления двух целых, обработайте ошибку переполнения...

Обработка исключительных ситуаций (блок try и catch)
Еще раз здравуствуйте! Опять я на пути изучения великого и могучего Си-шарпа, и...

Обработка исключительных ситуаций(анализ введенного номера)
помогите. Опишите функцию анализа введенного пользователем номера ,...

Обработка исключительных ситуаций и дальнейшее выполнение кода
Всем добрый день, столкнулся с такой проблемой: при нахождении какого-либо...


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

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

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