Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.26.176] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте. Я начал учить C# и WCF неделю назад, отсюда такие глупые вопросы:
Предположим, есть некий WCF сервис [ServiceContract] public interface IService { [OperationContract] void Method1(); [OperationContract] //... //... //... } и клиент этого сервиса void Main() { ServiceClient Client = new ServiceClient(); //... } Во избежание вылетов вызываю методы в блоке try try { Client.Method1(); } catch(Exception ex) { Client.Abort(); MessageBox.Show(ex.ToString()); Application.Current.Shutdown(); } Если метод всего 1, блоки try-catch глаза не мозолят. А если их много (Client.Method1(), Client.Method2(), Client.Method3()...) и вызывать каждый в отдельном блоке try-catch, код выглядит просто ужасно. Можно выкинуть эти try-catch, но тогда клиент будет падать, если сервер "временно недоступен" или просто-напросто на компьютере клиента отсутствует подключение к интернету. То есть, если вызывать каждый метод в отдельном try-catch, получается стабильный, но ужасно НЕКРАСИВЫЙ код. А если без try-catch, соответственно красивый, но НЕСТАБИЛЬНЫЙ. Возможно ли избавиться от try-catch и не потерять стабильность? |
Сообщ.
#3
,
|
|
|
Spawn.NET
Так и знал, что мне кинут именно эту ссылку. Это не то. В статье написано о том, как в клиенте обрабатывать ошибки, возникающие на сервере. А мне всего-то надо, чтобы клиент не падал с ошибкой, если по каким-то причинам не удалось подключиться к серверу. Как вариант - вызывать все методы сервиса в отдельных блоках try-catch. Но, повторюсь, если методов много, код получается некрасивый (одни try-catch). Других вариантов нет? |
Сообщ.
#4
,
|
|
|
То ли я чего-то не понял, то ли одно из двух...
Чем тебе не по нутру вспомогательный метод, через который можно будет пропускать все методы, аля public void DoAction(Action act) { try { act(); } catch {} } В статье красиво написаны подобные "помощники". |
Сообщ.
#5
,
|
|
|
Spawn.NET
Тоже не вариант. Не все же методы сервиса имеют тип void. А для каждого типа делать свой DoAction - еще хуже, чем куча try-catch. |
Сообщ.
#6
,
|
|
|
GoldenJoe, Generic в "зубы".
private T DoAction<T>(Func<T> act) { return act(); } |
Сообщ.
#7
,
|
|
|
Spawn.NET
Про generic не знал, спасибо (в шарпе новичек же). Один минус только - придется реализовывать DoAction в каждом классе (ведь я вызываю методы сервиса не только в Main). |
Сообщ.
#8
,
|
|
|
Цитата GoldenJoe @ Один минус только - придется реализовывать DoAction в каждом классе (ведь я вызываю методы сервиса не только в Main). сделай static метод и вызывай откуда угодно public class Program { public static T DoAction<T>(Func<T> act) { return act(); } } public class Program2 { private void Test() { Program.DoAction<bool>( ... ); } } |
Сообщ.
#9
,
|
|
|
Spawn.NET
Невозможно получить аргумент типа для метода '[имя проекта].App.DoAction<T>(System.Func<T>)' из данных использования. Попробуйте указать аргументы типа явным образом. (класс называется App, ибо WPF, а не WinForms) Добавлено Такая ошибка возникает, когда я вызываю App.DoAction(Client.SomeMethod([параметры])); |
Сообщ.
#10
,
|
|
|
Цитата Такая ошибка возникает, когда я вызываю App.DoAction(Client.SomeMethod([параметры])); App.DoAction<T>(Client.SomeMethod([параметры])); где T возвращаемый тип |
Сообщ.
#11
,
|
|
|
GoldenJoe, без возвращаемого типа (ну, или с типом void) - Action<T1,T2,...,TN>, где TN - типы параметров. С возвращаемым типом - Func, где последний T - возвращаемый тип, все предшествующие - типы параметров.
Action и Func это всего лишь делегаты, которые можешь насоздавать сам, если, например, потребуется больше 4-х параметров в Action или Func. |
Сообщ.
#12
,
|
|
|
Наиболее подходящий перегруженный метод для '[неважно].App.DoAction<bool>(System.Func<bool>)' имеет несколько недопустимых аргументов. Подучить мне надо шарп видимо.
|
Сообщ.
#14
,
|
|
|
Spawn.NET
Сделал так public static T DoAction<T>(Func<T> action) { try { return action(); } catch (Exception ex) { //... } } Если метод сервиса не принимает параметры - все ок. Я так понял, если все-таки метод принимает параметры, надо наплодить еще DoAction'ов: с Func<T, T> для 1 параметра, с Func<T, T, T> для 2... Или я не так понял? |
Сообщ.
#15
,
|
|
|
В зависимости от типов параметров - да, хотя я бы скорее всего передавал бы массив параметров типа object, а там уж разбирался что к чему, чтобы много методов не плодить.
|