Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / try catch и throw new правильное использование / 24 сообщений из 24, страница 1 из 1
05.06.2013, 12:09
    #38286506
Che0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
Добрый день. Сразу к делу:
Есть метод 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
05.06.2013, 12:42
    #38286578
Che0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
Возможно я не четко сформулировал задачу, извиняюсь за это. Могу уточнить если укажите на нужные моменты
...
Рейтинг: 0 / 0
05.06.2013, 12:52
    #38286598
vindofs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
По-хорошему обрабатывать исключения должен тот, кто использует данный метод.
...
Рейтинг: 0 / 0
05.06.2013, 13:03
    #38286620
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
vindofs,
Не понятно
Есть метод ReadUserInfo, он читает данные из текстового файла, тут может возникнуть много эксэпшенов. как стандартных так и я могу добавить в метод throw new .


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

if (info.SomeField < 0)
{
   throw....
}
...
Рейтинг: 0 / 0
05.06.2013, 13:20
    #38286666
vindofs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
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
05.06.2013, 13:41
    #38286720
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
vindofsА что не понятно?


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

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


Да как угодно. Если вызывающему метод не важно, какая ошибка произошла - то метод ReadUserInfo можно целиком обернуть в try-catch, а в случае ошибки возвращать null или типа того. Ну а если юзеру надо сказать, что там случилось (нет файла, или он неправильной структуры, или нет прав доступа), при чем сделать это на верхнем уровне - тогда да, не нужно так делать.
...
Рейтинг: 0 / 0
05.06.2013, 13:44
    #38286723
Che0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
Спасибо за ответы
На первый мой вопрос вы ответили, на второй нет. Сейчас поясню
пример:
Код: 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
05.06.2013, 13:53
    #38286733
vindofs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
Che0,

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



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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
try
{
   ConfigureClient();
}
catch (Exception ex)
{
....
return;
}
Start();
...
Рейтинг: 0 / 0
05.06.2013, 14:09
    #38286779
vindofs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
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
05.06.2013, 14:17
    #38286792
Che0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 IrrPublicator irrpublic = new IrrPublicator();
                
                try{
                    irrpublic.ConfigureClient();
                    irrpublic.Start();
                }
                catch(Exc){
,


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


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


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

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



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



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

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

почему нет? все зависит от ситуации опять же. Если допускается просто игнорирование, то флаг (вам в руки:)), если надо в грубой форме сообщить, то кидайте исключение.
...
Рейтинг: 0 / 0
05.06.2013, 17:29
    #38287178
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch и throw new правильное использование
Парни, много буков. Вот так должно быть:
Код: 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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / try catch и throw new правильное использование / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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