.net С# обработка исключений в 64-битном режиме
Я столкнулся с проблемой в моем приложении С# webservice. Исключения больше не обрабатываются в определенный момент. Приложение просто останавливается без каких-либо дополнительных исключений для сообщений/сбоев. Вот что происходит:
Проблема:
- в секции catch метода, я бросаю новое Исключение, содержащее
дополнительная информация об исключении;
- основное исключение исходит из другой части моего приложения;
"стек" исключений составляет около 20, но это, похоже, не
здесь проблема;
- при использовании сервера разработки VS2012 (предположим, что это 32 бит) или IIS в 32-битном режиме, выбранное исключение подбирается вызывающим методом, как ожидалось (наконец, в результате возникает исключение FaultException моего веб-сервиса)
Шаги, которые я использовал до сих пор или другую информацию, которая может быть полезна:
- Я могу легко воспроизвести исключение; он просто перестает работать на
точно такая же точка каждый раз, когда я запускаю свой код. К сожалению, мой
проект слишком велик/сложный, чтобы представить его здесь.
- Сначала я предполагал различия между сервером разработки VS2012 с одной стороны и IIS, а с другой - причиной моей проблемы.
Однако, когда я настраиваю пул приложений как 32 бит в IIS,
все работает нормально. Это приводит к переходу на 64 бит.
- Использование памяти не кажется проблемой; в моем приложении я использую (большие) входные файлы xml. Изменения в (размерах) этих файлов не имеют
влияние на мою проблему.
- Я пробовал использовать диагностические инструменты, предоставляемые для веб-сервисов. Мне это не очень помогает, так как я вижу, что происходит (или я должен сказать
не происходит) при отладке моего приложения в VS2012;
И вот оно!
Мой исходный код выглядит следующим образом:
try
{
//some code here throws an exception
}
catch (Exception ex)
{
throw new Exception("some message", ex); //after this line no activity anymore
}
Когда я меняю это на:
Exception myex = null;
try
{
//some code here throws an exception
}
catch (Exception ex)
{
myex = new Exception("some message", ex);
return null;
}
finally
{
if (myex!=null) throw myex;
}
моя проблема решена!? У кого-нибудь есть объяснение этого поведения? Я надеюсь, что я буду использовать обычные механизмы обработки исключений.
Еще одно замечание:
когда я добавляю "throw new Exception()" перед разделом try {}, мой код работает отлично (но, конечно, я этого не хочу).
Кто-нибудь подскажет? Спасибо заранее!
Ответы
Ответ 1
Выполняете ли вы это из рабочего фона?
Я думаю, что вы можете столкнуться с проблемой блокировки потока в первом разделе кода, но тогда нулевой возврат возвращает поток в ваш второй раздел кода.
Я видел некоторые ошибки в тех же строках, где использование команды MessageBox.Show() позволит коду работать правильно.
Ответ 2
Эта проблема может быть связана с самой платформой. Вы можете сообщить об этом Microsoft Connect и, надеюсь, вы получите ответ быстро.
Ответ 3
Являются ли какие-либо из ссылочных сборок в вашем проекте 32-бит случайными и указаны в этой области метода? Если это так, то было бы хорошим примером, почему запуск в 64 приведет к поведению undefined. Я был укушен этим раньше в другом проекте и имел таинственные сбои приложений.
Ответ 4
При использовании 64-битной машины я видел аналогичное поведение в VS2012, которое было исправлено (т.е. плохое поведение исчезло), явно установив платформу на x64 (а не "Любой процессор" ), а также отключив (сняв флажок ) любые "Включенные отладчики". У меня нет объяснений, почему эти хаки сработали.
Вы можете создать новую "активную платформу решений" в меню: Build- > Configuration Manager....
Настройки отладки можно найти в свойствах меню: Project- > proj.
Мне было бы интересно узнать, почему это работает, или если другие нашли аналогичные исправления для необъяснимых проблем поведения вокруг исключений.