Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
10 / 7 / 3
Регистрация: 25.02.2018
Сообщений: 86

Как заставить блок try заработать?

06.02.2019, 17:29. Показов 1501. Ответов 5

Студворк — интернет-сервис помощи студентам
Была задача ускорить работу программы с высокопроизводительными вычислениями (функции, выраженные несобственными интегралами). Решил проделать мемоизацию (записать в словарь пары аргумент-значение), поскольку самая "тяжёлая" функция выполняла впустую одни и те же вычисления. Но программа не заработала из-за появляющегося сравнения с null, которое я никак не могу исправить. Пытался проверять на null, выполнял всё в главном потоке и т. п. - проблема не решилась. Тогда я решил просто ввести блок try таким образом:
C#
1
2
3
4
5
6
7
8
9
               try
               {
                   return pr.RunOperationOrGetFromCache(val);//dic.GetOrAdd(val, M);
               }
               catch(NullReferenceException e)
               {
                   e.StackTrace.Show();
                   return M(val);
               }
Но при запуске программы выдаётся исключение NullReferenceException глубоко (то есть во внутренних методах, где я не могу отследить это исключение) внутри операции
C#
1
return pr.RunOperationOrGetFromCache(val);//dic.GetOrAdd(val, M);
из блока try, хотя по идее должен просто выполняться блок catch. Как исправить эту проблему? Может можно как-то отключить некоторые исключения конкретно в этом методе??
Явно существует какая-то проблема со словарём, но я просто хочу закрыть на неё глаза. Сама функция M считает всё правильно и без вылетов даже в асинхронном режиме и т. п. Для использования словаря взял следующий класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private class CustomProvider<S,OperationResult>
        {
            private readonly ConcurrentDictionary<S, Lazy<OperationResult>> _cache = new ConcurrentDictionary<S, Lazy<OperationResult>>();
 
            public OperationResult RunOperationOrGetFromCache(S operationId)
            {
                return _cache.GetOrAdd(operationId,
                    id => new Lazy<OperationResult>(() => RunLongRunningOperation(id))).Value;
            }
 
            internal Func<S, OperationResult> RunLongRunningOperation;
        }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.02.2019, 17:29
Ответы с готовыми решениями:

Как заставить storuboard заработать через код VB
Привет всем! Столкнулся с проблемой, что не могу активировать анимацию через код, через триггеры мне не надо. Спасибо

Как заставить заработать код
function ea(a, b, d) { a = document.createElement(a); if(b) for(c in b) a.setAttribute(c, b); d &amp;&amp; d.appendChild(a); ...

Слои в HTML или как заставить заработать z-index?
Добрый день! Всех с Рождеством! :) Подскажите, по какой причине не работает z-index на демо-странице? Там зелёный блок должен...

5
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.02.2019, 19:10
Цитата Сообщение от Дмитрий Паскаль Посмотреть сообщение
Пытался проверять на null, выполнял всё в главном потоке и т. п. - проблема не решилась. Тогда я решил просто ввести блок try таким образом
Если закрыть на проблему глаза, то она сама-собой не рассосется.
Никогда не ловите NullReferenceException — его возникновение указывает на баг в коде.
Лучше найти ошибку.

Цитата Сообщение от Дмитрий Паскаль Посмотреть сообщение
Явно существует какая-то проблема со словарём, но я просто хочу закрыть на неё глаза. Сама функция M считает всё правильно
По чистой случайности
Лучше найдите причину возникновения сразу, пока не получили по шапке за баги от заказчика.

Если не можете найти — выложите код, местные помогут.

Цитата Сообщение от Дмитрий Паскаль Посмотреть сообщение
ConcurrentDictionary<S, Lazy<OperationResult>>
Зачем Lazy, если сразу же при создании вы получаете значение?
0
10 / 7 / 3
Регистрация: 25.02.2018
Сообщений: 86
06.02.2019, 19:29  [ТС]
Ошибка заключается в том, что в связи с использованием коллекции в каких-то внутренних методах коллекции возникает сравнение с полями элемента (Point.x, Point.y), который оказывается null.
Я думал, что проблема как-то связана с тем, что я делаю вычисления параллельно, поэтому стал использовать ConcurrentDictionary вместо Dictionary, но это не помогло. Я начал считать последовательно, но даже если считать в одном потоке, проблема останется.
Я просмотрел код, значения Point нигде не могут равняться null, тем более они используются в дальнейшем как аргументы функции, обращающейся к полям Point.x, Point.y, которая хорошо работает, если не использовать коллекцию.
Мне нужен способ обойти эту непонятную ошибку вызова исключения внутри блока try.
Миниатюры
Как заставить блок try заработать?  
Изображения
 
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
06.02.2019, 23:37
Лучший ответ Сообщение было отмечено Дмитрий Паскаль как решение

Решение

Дмитрий Паскаль, открой окно Debug -> Stack Trace и посмотри откуда идет вызов. Скорее всего где-то в коде написано что-то вроде if (point != null).
1
10 / 7 / 3
Регистрация: 25.02.2018
Сообщений: 86
07.02.2019, 00:22  [ТС]
Спасибо!!!!
Оказалось, что была проверка типа point!=null && point.x == x ..., из-за чего почему-то вызывался встроенный в класс метод сравнения c точкой, а не сравнение по ссылке. Закомментировал, всё сразу заработало! Вычисления стали быстрее примерно в 5 раз!
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
07.02.2019, 17:13
Дмитрий Паскаль, он вызывался потому что для Point определен оператор != и запись point != null означает вызов именно этого оператора. Все логично. Чтобы он не вызывался и сравнились ссылки нужно использовать ReferenceEquals или приводить к object
C#
1
!ReferenceEquals(point, null)
C#
1
(object)point != null
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2019, 17:13
Помогаю со студенческими работами здесь

Как заставить свойство transition заработать одновременно на нескольких элементах?
Как заставить свойство transition выполняться одновременно на нескольких элементах(div) Есть код: &lt;div...

Не получается заставить заработать цикл с найденным значением
Dim rrr As Range Dim rngCurrent As Range Sheets(&quot;Лист1&quot;).Activate Columns(&quot;B:B&quot;).Select Set rrr = Selection.Find(What:=&quot;2&quot;,...

Как заработать не умея программировать все же заработать . Проявите понимание ситуации, any advice !
Доброго время суток ! Изучаю Java8 , все нравится. Планирую сменить род деятельности на программирование, но подготовка требует времени. А...

как заставить блок не обтекать другой блок
&lt;!doctype html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;title&gt;Valeria-clothes-интернет магазин женской одежды | Распродажи |...

Как заставить обтекать блок?
Доброго времени суток. Бьюсь и мучаюсь с шаблоном. Нашел очень красивый дизайн на вывод блочно товара и попытался присоединить к своему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных выбран регистр накопления, в. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru