.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.

Мне было бы интересно узнать, почему это работает, или если другие нашли аналогичные исправления для необъяснимых проблем поведения вокруг исключений.