← Zurück

.Do((e) => {})

Имеется следующая проблема

Допустим имеется класс-правило MyStrategyRuleClass унаследованное от StrategyRule если использовать this.When(this.MayStrategyRule).Do<AnyType>((e) => ) и в классе MyStrategyRuleClass при вызове base.Activate(NOTAnyType) передать по ошибке другой тип, то никаких ошибок не последут, выполнится override метод MyStrategyRuleClass.DisposeManaged() и правило перестанет работать

Думаю стоит должным образом обрабатывать подобную ошибку в реализации base.Activate() и Do(), чтобы генерировалось исключение

War dieses Thema hilfreich?

Thema teilen

Kommentare (11)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

Strategy.OnError + ITrader.ProcessDataError?

raf
raf Autor

Mikhail Sukhov: Strategy.OnError + ITrader.ProcessDataError? ИМХО удобней использовать throw

Alexander
Alexander

raf:

Mikhail Sukhov: Strategy.OnError + ITrader.ProcessDataError? ИМХО удобней использовать throw

Так вы саме обрабатываете событие OnError и ProcessDataError и реагируете как хотите. Останавливать работу приложения из-за ошибки внутри стратегии - не лучшая затея. Даже без имхо :)

raf
raf Autor

Alexander:

raf:

Mikhail Sukhov: Strategy.OnError + ITrader.ProcessDataError? ИМХО удобней использовать throw

Так вы саме обрабатываете событие OnError и ProcessDataError и реагируете как хотите. Останавливать работу приложения из-за ошибки внутри стратегии - не лучшая затея. Даже без имхо :)

Если в стратегии возникают несовпадения типов, то это стратегия написана с критической ошибкой и программа не должна исполняться дальше. Несовпадение типов в C# в случае, когда нет возможности оповестить об этом на этапе компиляцмм, всегда вызывает исключение на этапе исполнения. Это не логическая ошибка, чтобы ее ловить Strategy.OnError + ITrader.ProcessDataError. И я слабо представляю себе ситуации, когда несовпадение типов заложено в логику исполнения программы намеренно... - если уж это делается намеренно, то и не забывается про try catch().

Alexander
Alexander

raf:

Alexander:

raf:

Mikhail Sukhov: Strategy.OnError + ITrader.ProcessDataError? ИМХО удобней использовать throw

Так вы саме обрабатываете событие OnError и ProcessDataError и реагируете как хотите. Останавливать работу приложения из-за ошибки внутри стратегии - не лучшая затея. Даже без имхо :)

Если в стратегии возникают несовпадения типов, то это стратегия написана с критической ошибкой и программа не должна исполняться дальше. Несовпадение типов в C# в случае, когда нет возможности оповестить об этом на этапе компиляцмм, всегда вызывает исключение на этапе исполнения. Это не логическая ошибка, чтобы ее ловить Strategy.OnError + ITrader.ProcessDataError. И я слабо представляю себе ситуации, когда несовпадение типов заложено в логику исполнения программы намеренно... - если уж это делается намеренно, то и не забывается про try catch().

Вы не поняли. Исключение генерируется и оно перехватывается OnError и ProcessDataError. Обрабатывайте его там дальше как вам угодно. Хотите - делайте throw, хотите - перезагружайте стратегии. Всё зависит от вас.

raf
raf Autor

Alexander: Вы не поняли. Исключение генерируется и оно перехватывается OnError и ProcessDataError. Обрабатывайте его там дальше как вам угодно. Хотите - делайте throw, хотите - перезагружайте стратегии. Всё зависит от вас. Дело не в том. Я просто не очень согласен с концепцией перехвата для дальнейшей пользовательской обработки абсолютно всех ошибок. Ну да бог с ним) Возможно в этом есть свои плюсы.

Mikhail Sukhov
Mikhail Sukhov

raf: Дело не в том. Я просто не очень согласен с концепцией перехвата для дальнейшей пользовательской обработки абсолютно всех ошибок.

Распишите по подробнее вашу концепцию.

raf
raf Autor

Mikhail Sukhov:

raf: Дело не в том. Я просто не очень согласен с концепцией перехвата для дальнейшей пользовательской обработки абсолютно всех ошибок.

Распишите по подробнее вашу концепцию.

Мне кажется обработку ошибок обращения к данным надо отдать в руки разработчика. Тем более обрабатывать такие смешные явные ошибки как int i = "строка" (как в данном случае) вообще нет смысла. их надо ловить на этапе выявления и однозначно останавливать ход выполнения программы.

Mikhail Sukhov
Mikhail Sukhov

raf: Мне кажется обработку ошибок обращения к данным надо отдать в руки разработчика.

Оборачивайте код в try catch. Или еще как-то. S# тут при чем?

raf
raf Autor

по .ProcessDataError пришла ошибка (до установки версии S# 4.00 ее не было)

System.NullReferenceException: В экземпляре объекта не задана ссылка на объект. в StockSharp.Smart.SmartTrader.#=q3tLr$QxrenSG5YjlASuEI3YJKIPBQt01k9cpFHgYyJQ=.#=q$5T2LCDBBwM47J333ZpQN36ivGAIvPSDWMTtg61c0To=(Security #=q9Td6zhg46FvqcJdw5D1efg==) в StockSharp.Algo.BaseTrader.ProcessSecurityAction(String nativeSecurityId, Action1 action, Boolean ignoreIfNotExist) в StockSharp.Smart.SmartTrader.#=qSh1vnskI1TRN0VXH6_nhVXXVGijngdMW2AF_OFWjCXE=(String #=qyB8WsQekpkIh6dSNGced6A==, Trade #=qEBLG0UGbL90b4xwxzy0R6A==, Decimal #=q0E_NA6nZmhvkhKH9Ci8zww==, Decimal #=qrYwttbT28gJSOUZtT_4JZA==, Decimal #=qEfyBi1RA4cGneDuQdY1hwQ==, Decimal #=qZGMC$OXg6K$aauN5DNv2dA==, Int32 #=qT0uNmuX0Fqr6QaLol1s56w==, Quote #=qTapZLK3QErZ7k09eitKrgA==, Quote #=q2pQGnK9SatV4DyqfKpw1aA==, Decimal #=q$HfbK2GI21tagi2bu2fLwA==, Pair2 #=qpLMOA6PGGidWhGuu6M6c2w==, Pair2 #=qIGoV0D89lP0Mcox407wPfA==, Pair2 #=q7DyFstvU7yzu9l4DEYRD9g==, Int32 #=qj7GnYHiH938qOmf2rsb_$w==) в Ecng.Common.DelegateHelper.SafeInvoke[T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14](Action`14 handler, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14) в StockSharp.Smart.SmartComWrapper.#=q25OG9KgOP3T$2fbADDueKDH$kJg0yiuVvMXisxs4WHg=.#=qssQr6uP7yJ480vRmReP11dv9g6dlSBmwuTLvi5k1_5I=() в StockSharp.Algo.BaseTrader.ProcessEvents(Action handler)

где ее искать, не подскажете?

Mikhail Sukhov
Mikhail Sukhov

raf: где ее искать, не подскажете?

Так, это бага у нас. Будем заливать фикс на КодеПлекс.