Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка исключений 
:(
    Опции темы
Хоббит
Дата 25.6.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



Есть класс (допустим выполняющий операции с БД). Есть методы в них может произойти исключительная ситуация... допустим при выполнения sql команды .... надо его обработать на более высоком уровне чем этот метод, да и текст по культурней вывести ... то есть я думаю надо так

Код

public void Connect()
{
  try
  {
    действия с Sql которые могут породить исключение
  }
  catch
  {
     throw(параметры); //создание своего культурного исключения
  } 
}


в коде

try
{
  Connect();
}
catch
{
  Обработка уже моего исключения
}


Я правильно написал ... просто визуалки рядом нет... не могу проверить! 
PM MAIL   Вверх
B3cK
Дата 25.6.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.5.2005
Где: Минск

Репутация: нет
Всего: 1



Код

public void Connect()    
{    
 ...
     throw new Exception(); //создание своего культурного исключения    
 ...    
}    


в коде    
try    
{    
  Connect();    
}    
catch(Exception e)    
{    
  Обработка уже моего исключения    
}
 
PM MAIL ICQ   Вверх
arilou
Дата 27.6.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Хоббит, не так, а вот так:

Код

public void Connect()
{
  try
  {
    действия с Sql которые могут породить исключение
  }
  catch(Exception e)
  {
     throw new МоеИсключение(параметры, ex); //создание своего культурного исключения с передачей реального в InnerException.
  } 
}


в коде

try
{
  Connect();
}
catch(МоеИсключение e)
{
  Обработка уже моего исключения
}
 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Exception
Дата 28.6.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Цитата(Хоббит @  25.6.2006,  13:59 Найти цитируемый пост)
  catch


Цитата(B3cK @  25.6.2006,  14:37 Найти цитируемый пост)
catch(Exception e)  


Отрывать руки и не приклеивать! Обязательно надо делать свитчи на разные типы исключений, иначе - совать его в InnerException. А то неизвестно - у тебя полетело исключение потому что SQL неправильный или потому что где-то что-то не кастуется.

Вот так:

Цитата(arilou @  27.6.2006,  18:52 Найти цитируемый пост)
 throw new МоеИсключение(параметры, ex);

 
PM   Вверх
mr.DUDA
Дата 28.6.2006, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



З.Ы. могу только проконстатировать, что при постоянном использовании оператора trrow в своих приложениях, производительность серьёзно падает... Это действительно так. 


--------------------
user posted image
PM MAIL WWW   Вверх
Exception
Дата 28.6.2006, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



P.S. Лично мне нравится свитч из Немерле:

Код
в коде
try
{
  Connect();
}
catch
{
   | e : МоёИсключение => ...
   | e : ТвоёИсключение => ...
   | _ => Console.WriteLine("Что-то другое")
}
 
PM   Вверх
agl
Дата 2.11.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 25.6.2006

Репутация: нет
Всего: 3



Поделитесь пожалуйста мыслями, чем обработка исключений(при помощи встроенных классов исключений или написанных программистом) лучше чем обыкновенные проверки в if'ах.
Например есть класс Queue и в нем имеется функция get(). В функции надо обработать ситуацию когда пользователь пытается получить из пустой очереди какую то инфу.
1-ый вариант обработки возможной ошибки
Код

public class Queue{
//...........................................

      public char get()
        {
            if(this.getloc == this.putloc)
            {
                Console.WriteLine(" - The Queue is empty.");
                return (char)0;
            }
            return this.q[++getloc];
        }
}


2-ой вариант обработки возможной ошибки
Код


public class QueueEmptyException : ApplicationException
{
        public QueueEmptyException() : base(){}
        public QueueEmptyException(string str) : base(str){}
        
        public override string ToString()
        {
            return "\n" + this.Message;
        }    
    
}

public class Queue{
//...........................................
       public char get()
        {
            if(getloc == putloc)
                throw new QueueEmptyException(" - The Queue is empty.");
            return q[++getloc];
        }
}

очень хотелось бы услышать от опытных людей всегда ли стоит использовать обработку исключений при помощи try / catch / throw, т.к. прога из-за таких обработок оооооооочень тормозит.
PM   Вверх
ivashkanet
Дата 2.11.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Все зависит от:
1) умеет ли класс, использующий твой метод (get -- тоже метод) правильно распознать произошла ошибка или нет.
В твоем случае это Console.WriteLine(" - The Queue is empty.") что вообще никто не словит (если сильно не захочет) и возврат нуля (который теперь исключен из допустимых символов).
2) кто должен отвечать за правильность данных. Тот кто вызывает либо тот кого вызывают. Если первый, то логичнее (и универсальнее) использовать throw (на случай если "профессор--лопух"), если нет, то возможно обработать исключение более мягко и уведомить вызывающий код задокументированным способом.
3) критично ли эта операция. Если это юзверьинтерфейс, то человек особо не заметит задержки произошедшей по вине throw (зато ошибаться будет часто). Если же это автоматическая обработка большого объема данных (даже если не большего), то нужно избежать как можно большего количества throw
4) может кто-нить еще добавит что-нить

ИМХО



PM MAIL WWW ICQ   Вверх
agl
Дата 3.11.2006, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 25.6.2006

Репутация: нет
Всего: 3



Цитата
1) умеет ли класс, использующий твой метод (get -- тоже метод) правильно распознать произошла ошибка или нет.
В твоем случае это Console.WriteLine(" - The Queue is empty.") что вообще никто не словит (если сильно не захочет) и возврат нуля (который теперь исключен из допустимых символов).

ну это не проблема, а просто пример =), в жизни можно сделать errflag например ну и задавать ему true если произошла ошибка.

Спасибо за ответ  smile , получила пищу для мыслительного процесса  smile 


Это сообщение отредактировал(а) agl - 3.11.2006, 00:44
PM   Вверх
archimed7592
  Дата 3.11.2006, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 7
Всего: 93



Цитата(mr.DUDA @ 28.6.2006,  01:24)
З.Ы. могу только проконстатировать, что при постоянном использовании оператора trrow в своих приложениях, производительность серьёзно падает... Это действительно так.

mr.DUDA, а что ты имеешь ввиду под использованием throw? я вот просто подумываю, что будет работать быстрее:
Код
void abc1 (...)
{
     try
     {
         /* block #1 */
     }
     catch (Exception e)
     {
          throw new Exception (String.Format ("something failed in block #1 ({0})", e.Message));
     }
     try
     {
         /* block #2 */
     }
     catch (Exception e)
     {
          throw new Exception (String.Format ("something failed in block #2 ({0})", e.Message));
     }
/* ... */
     try
     {
         /* block #N */
     }
     catch (Exception e)
     {
          throw new Exception (String.Format ("something failed in block #N ({0})", e.Message));
     }
}

void abc2 (...)
{
     try
     {
         /* block #1 */
         /* block #2 */
         /* ... */
         /* block #N */
     }
     catch (Exception e)
     {
          throw new Exception (String.Format ("something failed in abc2 ({0})", e.Message));
     }
}

ты имеешь ввиду заключение кода в try...catch ухудшает быстродействие? или непосредственное исполнение оператора throw ухудшает бытродействие?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
ivashkanet
Дата 3.11.2006, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



archimed7592, непосредственное развертывание стека и поиск оператора который этот throw словит --- вот что замедляет быстродействие
Цитата(archimed7592 @  3.11.2006,  04:19 Найти цитируемый пост)
я вот просто подумываю, что будет работать быстрее:

Ну попробуй. Я, например, такого исследования не проводил. 
Хотя, на вскидку, ---- второй будет быстрее, ведь он словит эксэпшен в первом блоке, а в остальные даже не пойдет  smile 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 3.11.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(archimed7592 @  3.11.2006,  04:19 Найти цитируемый пост)
ты имеешь ввиду заключение кода в try...catch ухудшает быстродействие? или непосредственное исполнение оператора throw ухудшает бытродействие?

Генерация исключения (всё что происходит при этом - упаковка stack trace,  и поиск подходящего блока catch) - оверхед, и если злоупотреблять оператором throw, то в худшем случае оверхед может и до десятка процентов дорасти. Простой пример, без вложенных try..catch:

Код
using System;

class Program
{
    void MethodWithoutException()
    {
        // тут какое-то действие
        for (int i = 0; i < 10000; i++) ;
    }

    void MethodWithException()
    {
        // то же самое действие, плюс throw
        for (int i = 0; i < 10000; i++) ;
        throw new InvalidCastException("bla-bla-bla");
    }

    static void Main()
    {
        Program p = new Program();

        DateTime start1 = DateTime.Now;
        for (int i = 0; i < 10000; i++)
        {
            p.MethodWithoutException();
        }
        TimeSpan span1 = DateTime.Now - start1;

        DateTime start2 = DateTime.Now;
        for (int i = 0; i < 10000; i++)
        {
            try
            {
                p.MethodWithException();
            }
            catch (InvalidCastException)
            {
            }
        }
        TimeSpan span2 = DateTime.Now - start2;

        // выводит: MethodWithoutException: 265,625, MethodWithException: 656,25
        Console.WriteLine("MethodWithoutException: {0}, MethodWithException: {1}", span1.TotalMilliseconds, span2.TotalMilliseconds);
    }
}


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


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0993 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.