Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Picol
1 / 1 / 1
Регистрация: 26.03.2018
Сообщений: 38
1

Исключения

12.10.2019, 14:04. Просмотров 862. Ответов 10
Метки нет (Все метки)

Доброго времени суток, есть код:




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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Security;
 
 
namespace CollectionProblem
{
    class Program
    {
        public class HierarchyDrive
        {
            public HierarchyDrive(DirectoryInfo dir)
            {
                Drive = dir;
                AddDrive(dir);
            }
            public DirectoryInfo Drive { get; set; }
 
            public ObservableCollection<HierarchyDrive> DriveH { get; set; } = null;
 
            public void AddDrive(DirectoryInfo dir)
            {
                try
                {
                    foreach (DirectoryInfo d in dir.EnumerateDirectories())
                    {
                        DriveH.Add(new HierarchyDrive(d));
                    }
                }
                catch (DirectoryNotFoundException e)
                {
                    Console.WriteLine(e.Message);
                    return;
                }
                catch (SecurityException e)
                {
                    Console.WriteLine(e.Message);
                    return;
 
                }
                catch (UnauthorizedAccessException e)
                {
                    Console.WriteLine(e.Message);
                    return;
 
                }
                catch
                {
                    Console.WriteLine("111");
                    return;
 
                }
                finally
                {
                    Console.WriteLine("finally");
                   // DriveH = null;
                }
            }
 
        }
 
 
        public class Gena
        {
 
 
            public ObservableCollection<HierarchyDrive> DriveHier { get; set; } = new ObservableCollection<HierarchyDrive>();
            private void InitHierarchy()
            {
                SearchDriver search = new SearchDriver();
 
                    foreach (DirectoryInfo d in search.SearchParrentDirectory())
                        DriveHier.Add(new HierarchyDrive(d));
            }
            public Gena()
            {
                InitHierarchy();
            }
        }
        static void Main(string[] args)
        {
            Gena g = new Gena();
            Console.ReadKey();
        }
    }
}

Дело в том, что при получении исключения программа завершает весь стек методов,переходя к каждой инструкции catch всех методов в стеке, несмотря на то что перехвачено исключение в самом верхнем методе стека.Даже если нет соответствующего блока catch в других методах, то программа всё равно завершает весь стек. Проверить заведомо, выйдет ли исключение или нет я не могу. Код проблемы здесь https://github.com/DGRTF/ConsoleProblem.git
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2019, 14:04
Ответы с готовыми решениями:

Организация собственного исключения и передача в него исходного исключения
Для обработки исключений при работе с БД я создал собственное исключение: public class...

Исключения
Для заданного натурального N и действительного подсчитать следующие суммы:...

Исключения
Продолжаю изучать C#. Дополз таки до исключений, вопрос такой как посмотреть эти самые...

Исключения в C#
Как говорят программисты исключите исключение из моей жизни (ирония). Вот интересно как работают...

Исключения
Как создать пользовательское исключение? Например, если число отрицательное, то вызывается...

10
Элд Хасп
Модератор
3540 / 2550 / 835
Регистрация: 21.04.2018
Сообщений: 8,077
Записей в блоге: 2
12.10.2019, 16:28 2
Picol, выложите сюда коды и текст ошибок.
Скрин в хорошем разрешении.
Я в длительной поездке и без компа.
На форум захожу со смарта.
GitHub посмотреть не могу.
0
Picol
1 / 1 / 1
Регистрация: 26.03.2018
Сообщений: 38
12.10.2019, 17:58  [ТС] 3
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Picol, выложите сюда коды и текст ошибок.
В принципе это и есть весь код. Единственное ,что метод SearchParrentDirectory() класса SearchDriver находится в другом файле и возвращает массив всех корневых директорий на устройстве.Ошибок в коде не наблюдается, просто программа не заполняет коллекцию, когда вылетает исключение.Она завершает весь стек методов и завершает их работу, в итоге коллекция содержит только один элемент в иерархии. Исключение известно,это ошибка доступа к каталогу из-за отсутствия разрешения.Несмотря на то что это исключение перехватывается в последнем методе стека, оно передаёт это catch блокам предыдущего метода в стеке и завершает, потом следующему и т д. Но завершиться должен только последний метод стека.


На фотографии вывод консоли. Там показывается, что вылетает исключение доступа к директории (первая строка) когда. Оно вылетает в 3 каталоге, следовательно в 3 методе стека, метод завершается( как и должно быть) после чего должен выполняться цикл 2-го метода, но завершается и он. Но почему?
0
Миниатюры
Исключения  
Lexeq
1007 / 659 / 455
Регистрация: 21.01.2014
Сообщений: 1,757
Завершенные тесты: 2
12.10.2019, 18:06 4
Picol, пройдитесь пошагово и посмотрите, что происходит.
0
12.10.2019, 18:06
Элд Хасп
Модератор
3540 / 2550 / 835
Регистрация: 21.04.2018
Сообщений: 8,077
Записей в блоге: 2
12.10.2019, 18:41 5
Picol, для начала об общем.
Не используйте вложенные классы!
В редких случаях имеет смысл использовать вложенные ПРИВАТНЫЕ классы.
Но никогда не видел адекватного решения с ПУБЛИЧНЫМИ вложенными классами.

Такой код ужасно не удобно читать, он путает.
0
Элд Хасп
Модератор
3540 / 2550 / 835
Регистрация: 21.04.2018
Сообщений: 8,077
Записей в блоге: 2
12.10.2019, 18:55 6
Лучший ответ Сообщение было отмечено Picol как решение

Решение

Picol, где коллекция инициализируется?

Попробуйте так:
C#
10
11
           public ObservableCollection<HierarchyDrive> DriveH { get; } 
                   = new ObservableCollection<HierarchyDrive>();
1
Picol
1 / 1 / 1
Регистрация: 26.03.2018
Сообщений: 38
12.10.2019, 19:19  [ТС] 7
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Picol, где коллекция инициализируется?
Попробуйте так:
C#Выделить код
10
11
* * * * * *public ObservableCollection<HierarchyDrive> DriveH { get; }
* * * * * * * * * *= new ObservableCollection<HierarchyDrive>();

Да Вы сам господь бог!!!!
Коллекция инициализирована!!!
Но вот почему так?Непонятно
0
Миниатюры
Исключения  
Элд Хасп
Модератор
3540 / 2550 / 835
Регистрация: 21.04.2018
Сообщений: 8,077
Записей в блоге: 2
12.10.2019, 19:27 8
Picol, а что не так?
Неё забывайте я не могу запустить код и сам посмотреть.
0
Picol
1 / 1 / 1
Регистрация: 26.03.2018
Сообщений: 38
12.10.2019, 19:33  [ТС] 9
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Picol, а что не так?
Неё забывайте я не могу запустить код и сам посмотреть.
Почему ,если прописать:
C#
1
public ObservableCollection<HierarchyDrive> DriveH { get; }
то иерархия классов не заполняется и вылетают все методы в стеке?
0
Элд Хасп
Модератор
3540 / 2550 / 835
Регистрация: 21.04.2018
Сообщений: 8,077
Записей в блоге: 2
12.10.2019, 19:41 10
Picol, потому что исключение возникает не при попытке доступа к директории на которую нет разрешений, а при записе элемента в несуществующую коллекцию.
1
Picol
1 / 1 / 1
Регистрация: 26.03.2018
Сообщений: 38
12.10.2019, 19:47  [ТС] 11
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Picol, потому что исключение возникает не при попытке доступа к директории на которую нет разрешений, а при записе элемента в несуществующую коллекцию.
Спасибо, учту при дальнейшей разработке!
0
12.10.2019, 19:47
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2019, 19:47

Исключения
вот есть такой кусочек кода на ++ vect::vect(int n) { if (n&lt;1) throw(n); p=new...

Исключения
Господа, почему здесь не обрабативаются исключения using System; class a { public void K()...

Исключения в C#
Здравствуйте! Прошу помочь, так как C# не изучал вообще, но появились требования сделать задачи. Со...


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

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

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