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

Поиск:

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


Опытный
**


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

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



Здравствуйте, наткнулся на такую проблему:
Есть class library, в ней есть метод
Код

        public void AddOperator(string pName, string pSurname, string pLastname, string pPassword, string pAbout)
        {
            if ((pName.Length > 0) && (pSurname.Length > 0) && (pLastname.Length > 0) && (pPassword.Length > 0) && (pPassword.Length <= 8))
            {
                try
                {
                    if (operatorManager.PasswordIsEmpty(pPassword))
                    {
                        operatorManager.AddOperator(new Operator(pName, pSurname, pLastname, pPassword, pAbout));
                    }
                    else
                        throw new PasswordBusyException();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            else
                throw new ParamsNotCorrectException();
        }


Есть WCF сервис, использующий данную библиотеку:
Код

        public void AddOperator(string pName, string pSurname, string pLastname, string pPassword, string pAbout)
        {
            try
            {
                dm.AddOperator(pName, pSurname, pLastname, pPassword, pAbout);
            }
            catch (PasswordBusyException passwordEx)
            {
                throw passwordEx;
            }
            catch (ParamsNotCorrectException paramsEx)
            {
                throw paramsEx;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


Есть тестовое приложение, использующее данный WCF сервис, в котором я специально передаю параметры для того чтобы вызвать исключение PasswordBusyException
Код

            try
            {
                client.AddOperator("ТестовоеИмя", "ТестоваяФамилия", "ТестовоеОтчество", "testpwd", "ТестовоеОписание");
            }
            catch (PasswordBusyException ex)
            {
                Console.WriteLine("Hello man");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

Но, при запуске приложения WCF сервис кидает исключение PasswordBusyException (как и надо)
user posted image
но приложение клиент принимает его как FaultException, поэтому вот этот код:
Код

            catch (PasswordBusyException ex)
            {
                Console.WriteLine("Hello man");
            }

не срабатывает, текст исключения Exception e:
Код

        Message    "Выдано исключение типа \"DataAccess.PasswordBusyException\"."    string

ведь тут явно указанно что было полученно исключение PasswordBusyException   smile 
если же указать 
Код

            catch (FaultException ex)
            {
                Console.WriteLine("Hello man");
            }

То код срабатывает, но это не подходит, так как нет возможности определить какое именно исключение сработало
Спасибо

Это сообщение отредактировал(а) Exai1e - 14.8.2010, 16:27


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Sartorius
Дата 14.8.2010, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Что-то я не уверен что исключения, брошенные в WCF  сервисе, так запросто в клиент попадают  smile Вместо исключения  советую возвращать в клиент что-нибудь осмысленное.

Это сообщение отредактировал(а) Sartorius - 14.8.2010, 18:48
PM MAIL ICQ   Вверх
Exai1e
Дата 14.8.2010, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашел статью про обработку исключений в WCF сервисах, сделал вроде по примеру
метод в WCF сервисе
Код

...
        [OperationContract]
        [FaultContract(typeof(PasswordBusyException))]
        void AddOperator(string pName, string pSurname, string pLastname, string pPassword, string pAbout);
...

Код

        public void AddOperator(string pName, string pSurname, string pLastname, string pPassword, string pAbout)
        {
            try
            {
                dm.AddOperator(pName, pSurname, pLastname, pPassword, pAbout);
            }
            catch (PasswordBusyException)
            {
                PasswordBusyException exception = new PasswordBusyException("Оператор с таким паролем уже существует");
                throw new FaultException<PasswordBusyException>(exception, exception.Message);
            }
            catch (ParamsNotCorrectException)
            {
                throw new FaultException<ParamsNotCorrectException>(null);
            }
            catch (Exception e)
            {
                throw e;
            }
        }


метод в клиенте
Код

            try
            {
                client.AddOperator("ТестовоеИмя", "ТестоваяФамилия", "ТестовоеОтчество", "testpwd", "ТестовоеОписание");
            }
            catch (FaultException<PasswordBusyException> pbEx)
            {
                Console.WriteLine(pbEx.Message);
            }
            catch (FaultException<ParamsNotCorrectException>)
            {
                Console.WriteLine("Неверные параметры");
            }
            catch (Exception)
            {
                Console.WriteLine("Просто исключение");
            }

на консоль выводится "Просто исключение"  smile 
ссылка на статью
http://www.gotdotnet.ru/blogs/AlexMAS/6570/

Это сообщение отредактировал(а) Exai1e - 14.8.2010, 19:58


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Sartorius
Дата 14.8.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Exai1e @  14.8.2010,  20:32 Найти цитируемый пост)
ссылка на статью
http://www.gotdotnet.ru/blogs/AlexMAS/6570/ 
 Круто. Исключения тоже маршалятся...  smile А в контракте сервиса ты их прописал?


PM MAIL ICQ   Вверх
Exai1e
Дата 14.8.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Sartorius
да
Код

...
        [OperationContract]
        [FaultContract(typeof(PasswordBusyException))]
        void AddOperator(string pName, string pSurname, string pLastname, string pPassword, string pAbout);
...



--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Exai1e
Дата 16.8.2010, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не ужели не кто не сталкивался с подобной задачей ?


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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