powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / try catch и throw new правильное использование
24 сообщений из 24, страница 1 из 1
try catch и throw new правильное использование
    #38286506
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Сразу к делу:
Есть метод ReadUserInfo, он читает данные из текстового файла, тут может возникнуть много эксэпшенов. как стандартных так и я могу добавить в метод throw new .
Далее в коде я использую полученные данные в работе программы. к примеру
Код: c#
1.
2.
3.
1)var info=TextReading.ReadUserInfo("info.txt")
2)Console.Writeline(info.ToString());
3)Какая то логика основывающаяся на данных info



Первый вопрос: где обрабатывать исключения? Внутри метода ReadUserInfo или же снаружи?
Вопрос второй: как мне правильно прервать работу программы идущей далее за сбойной частью кода
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
try
            {
var info=TextReading.ReadUserInfo("info.txt")
Console.Writeline(info.ToString());

            }
            catch (Exception ex)
            {
             Console.Writeline(ex.Message);
            }
3)Какая то логика основывающаяся на данных info// что делать тут? Выбрасывать еще одно исключение? или же в верхнем catch выбрасить ?   



Код примеров писал в браузере, могут быть описки. Спасибо.
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286578
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно я не четко сформулировал задачу, извиняюсь за это. Могу уточнить если укажите на нужные моменты
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286598
vindofs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-хорошему обрабатывать исключения должен тот, кто использует данный метод.
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286620
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vindofs,
Не понятно
Есть метод ReadUserInfo, он читает данные из текстового файла, тут может возникнуть много эксэпшенов. как стандартных так и я могу добавить в метод throw new .


что за эксепшены - основанные на какой-то логике (ну типа возраст Usera не может быть отрицательным), или просто отлов, существует ли файл, или нет? Если первое, то эксепшенов в этом коде имхо быть не должно - лучше их выбрасывать тут:
Код: sql
1.
2.
3.
4.
5.
6.
var info = ReadUserInfo("text.txt");

if (info.SomeField < 0)
{
   throw....
}
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286666
vindofs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisvindofs,
Не понятно
Есть метод ReadUserInfo, он читает данные из текстового файла, тут может возникнуть много эксэпшенов. как стандартных так и я могу добавить в метод throw new .


что за эксепшены - основанные на какой-то логике (ну типа возраст Usera не может быть отрицательным), или просто отлов, существует ли файл, или нет? Если первое, то эксепшенов в этом коде имхо быть не должно - лучше их выбрасывать тут:
Код: sql
1.
2.
3.
4.
5.
6.
var info = ReadUserInfo("text.txt");

if (info.SomeField < 0)
{
   throw....
}



А что не понятно? Если у нас есть метод ReadUserInfo, читающий из файла, и метод вызываюзий этот читающий метод, то ReadUserInfo бросает эксепшен, а вызывающий обрабатывает его. Или как ReadUserInfo должен в этом случае сам обработать исключение FileNotFoundException?
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286720
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vindofsА что не понятно?


Ты написал, что могут быть много эксепшенов, как стандартных, так и твоих собственных throw. Не понятно было про собственные.

Или как ReadUserInfo должен в этом случае сам обработать исключение FileNotFoundException?


Да как угодно. Если вызывающему метод не важно, какая ошибка произошла - то метод ReadUserInfo можно целиком обернуть в try-catch, а в случае ошибки возвращать null или типа того. Ну а если юзеру надо сказать, что там случилось (нет файла, или он неправильной структуры, или нет прав доступа), при чем сделать это на верхнем уровне - тогда да, не нужно так делать.
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286723
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответы
На первый мой вопрос вы ответили, на второй нет. Сейчас поясню
пример:
Код: 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.
class IrrPublicator
    {
     private IClientManger clientManager;
        private IList<Ad> ads;
        private int timeout;

        public void ConfigureClient(string path="Settings.txt") 
        {
         
            try
            {
			   var user = TextReading.ReadUserInfo(path);
                timeout = user.SleepSeconds * 1000;
                clientManager = new ClientManager(user);
            }
            catch (FileNotFoundException ex) 
            {
                Console.WriteLine(ex.Message);
           }
          }
      
        public void Start() 
        {

            clientManager.Login();
            try
            {
                clientManager.DeleteAllAds();
                foreach (Ad ad in ads)
                {
                    Console.WriteLine("+");
                    clientManager.PublicAds(ad);
                    Console.WriteLine("sleep on "+timeout.ToString());
                    Thread.Sleep(timeout);
                    Console.WriteLine("sleep off");
                }
            }
            catch (InvalidOperationException ex) 
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
	
	 static void Main(string[] args)
        {
           
                IrrPublicator irrpublic = new IrrPublicator();
                irrpublic.ConfigureClient();
                irrpublic.Start();
          
            Console.ReadKey(true);
        }



Допустим у нас файл не смог прочитаться, эксепшен отловился. Сейчас в Main все равно вызовется метод irrpublic.Start(). По хорошему надо останавливать работу программы, так как смысла запускать Start при нерабочем ConfigureClient нету. Как это сделать правильно? Выбросить еще одно исключение внутри cath{} предыдущего обработчика? Если да, то какое именно.
Спасибо
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286733
vindofs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0,

Код: c#
1.
2.
3.
4.
5.
                IrrPublicator irrpublic = new IrrPublicator();
                
                if(irrpublic.ConfigureClient())
                    irrpublic.Start();
                else Console.WriteLine("См ошибки выше или в логе");



Нет?
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286734
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
if (irrpublic.ConfigureClient()) irrpublic.Start(); 
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286750
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если void ConfigureClient, то обращатся к поле типа irrpublic.IsConfigure.
Это понятно, а вариант с вызовом еще одного эксепешена не коректен? Или же просто если можно обойтись простой проверкой то обходить, иначе все таки выбрасывать еще одно исключение?
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286771
vindofs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0а если void ConfigureClient, то обращатся к поле типа irrpublic.IsConfigure.
Это понятно, а вариант с вызовом еще одного эксепешена не коректен? Или же просто если можно обойтись простой проверкой то обходить, иначе все таки выбрасывать еще одно исключение?

А смысл, если Уже было одно исключение ConfigureClient генерировать еще одно? Лучше тогда:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
                IrrPublicator irrpublic = new IrrPublicator();
                
                try{
                    irrpublic.ConfigureClient();
                    irrpublic.Start();
                }
                catch(Exc){
                    /// Обрабатываем....
                }
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286772
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vindofs,

сори перепутал тебя с топикстартером, прошу прощения!
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286775
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0По хорошему надо останавливать работу программы, так как смысла запускать Start при нерабочем ConfigureClient нету. Как это сделать правильно?
Спасибо

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
try
{
   ConfigureClient();
}
catch (Exception ex)
{
....
return;
}
Start();
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286779
vindofs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vindofsChe0а если void ConfigureClient, то обращатся к поле типа irrpublic.IsConfigure.
Это понятно, а вариант с вызовом еще одного эксепешена не коректен? Или же просто если можно обойтись простой проверкой то обходить, иначе все таки выбрасывать еще одно исключение?

А смысл, если Уже было одно исключение ConfigureClient генерировать еще одно? Лучше тогда:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
                IrrPublicator irrpublic = new IrrPublicator();
                
                try{
                    irrpublic.ConfigureClient();
                    irrpublic.Start();
                }
                catch(Exc){
                    /// Обрабатываем....
                }



Здесь, как я и говорил: Один генерирует, тот, кто вызывает - использует
Но как Pallaris заметил, можно обработать как угодно.
Рекомендация, из какой-то книжки была такая (своими словами):
Если метод возвращает значение, то он должен возвращать значение, которое вызывающий код проверяет на корректность. Если метод void, то выкидывает эксепшен, который перехватывается вызывающим кодом.
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286792
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 IrrPublicator irrpublic = new IrrPublicator();
                
                try{
                    irrpublic.ConfigureClient();
                    irrpublic.Start();
                }
                catch(Exc){
,


Насколько я понимаю, обрабатывать эксепшенны надо "максимально близко" от их выбросов. Если я прав, то конструкция выше противоречит этому
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286802
vindofs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 IrrPublicator irrpublic = new IrrPublicator();
                
                try{
                    irrpublic.ConfigureClient();
                    irrpublic.Start();
                }
                catch(Exc){
,


Насколько я понимаю, обрабатывать эксепшенны надо "максимально близко" от их выбросов. Если я прав, то конструкция выше противоречит этому
Вы правы.
Мой код не совсем корректен: Start() тоже может чего-то выкинуть. Палярис дал нужный код)
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286804
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 IrrPublicator irrpublic = new IrrPublicator();
                
                try{
                    irrpublic.ConfigureClient();
                    irrpublic.Start();
                }
                catch(Exc){
,


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

А тут типа далеко что-ли? Просто еще Start охватывается для проверки, что может тебе не подходить
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286822
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответы, они мне помогли. Буду признателен на ссылки на литературу по данному вопросу, так как все нюансы сам не рассмотришь.
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286868
vindofs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0Спасибо за ответы, они мне помогли. Буду признателен на ссылки на литературу по данному вопросу, так как все нюансы сам не рассмотришь.
Да как всегда: книги Совершенный код и шаблоны, а так же статьи в Интернете
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286946
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос в догонку, Если в классе есть строгий порядок методов, в моей же примере
Код: c#
1.
2.
irrpublic.ConfigureClient();
  irrpublic.Start();



Какие методы ограничение вызова одного Start()?
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286979
vindofs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0Вопрос в догонку, Если в классе есть строгий порядок методов, в моей же примере
Код: c#
1.
2.
irrpublic.ConfigureClient();
  irrpublic.Start();



Какие методы ограничение вызова одного Start()?

Через флаг - самое простое.
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38286991
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vindofs, а эксепшены тут неприменимы?
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38287015
vindofs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0vindofs, а эксепшены тут неприменимы?

почему нет? все зависит от ситуации опять же. Если допускается просто игнорирование, то флаг (вам в руки:)), если надо в грубой форме сообщить, то кидайте исключение.
...
Рейтинг: 0 / 0
try catch и throw new правильное использование
    #38287178
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парни, много буков. Вот так должно быть:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public void ConfigureClient(string path="Settings.txt") 
{
    try
    {
        var user = TextReading.ReadUserInfo(path);
        
        timeout = user.SleepSeconds * 1000;
        clientManager = new ClientManager(user);
    }
    catch (FileNotFoundException ex) 
    {
        Console.WriteLine(ex.Message);

        throw;
    }
}


И вместо Console.WriteLine стоит использовать какой-нить логгер.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / try catch и throw new правильное использование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]