Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
23 / 23 / 3
Регистрация: 24.02.2010
Сообщений: 105
1

Включение/выключение try/catch по условию на этапе компиляции. Возможно ли это?

28.10.2011, 10:59. Показов 4224. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго дня. При доработке и тестировании довольно большого проекта на ASP.NET (C#) возник вопрос: можно ли указать директиву DEBUG, с помощью которой можно включать/отключать блоки try/catch на этапе компиляции? Т.е. если идёт процесс разработки/отладки, то временно перехват исключений отключать, для релиза же нужно, чтобы все они включены. То есть чтобы нормально мог работать вот такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#define DEBUG
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
#if DEBUG
#else
        try
        {
#endif
            // здесь какой-либо код, который может привести к генерации исключения
            // и в случае отладки гораздо удобнее получить "жёлтую страницу", чтобы понять причину
            throw new Exception("Тестовая ошибка!");
#if DEBUG
#else
        }
        catch (Exception ex)
        {
            // вывод краткой информации об ошибке
            lbTest.Text = "Перехвачена ошибка! Тескт: " + ex.Message;
        };
        
#endif
    }
}
В этом тестовом примере блоки try/catch почему-то не работают в любом случае, независимо от того, определена ли директива DEBUG. И ещё вопрос: возможно ли глобальное объявление директивы (#define DEBUG) (для всего проекта), чтобы не вставлять его в каждый файл?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2011, 10:59
Ответы с готовыми решениями:

Chart. Включение/выключение сетки, масштабирование, поворот графика. Как это сделать?
.Net 4.5, Visual Studio 2012. Уважаемые форумчане, у меня возник такой вопрос: использую Chart,...

Как добавить анонимный тип в объект не на этапе компиляции, а на этапе выполнения программы? Надо для routes.MapRoute
В приложении ASP.NET MVC у меня есть xml файл с маршрутами типа: <route url="Home/{par1}/{par2}"...

Включение и выключение
Доброго времени суток. Подскажите, пожалуйста, я провёл чистку компа и вот после этого при...

C++14: вычисления на этапе компиляции
Добрый день. Есть такой код:struct Qaz { constexpr Qaz(uint8_t index) : _index(index) {} ...

17
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 384
28.10.2011, 11:14 2
может так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#define DEBUG
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
#if DEBUG
 
        try
        {
            // здесь какой-либо код, который может привести к генерации исключения
            // и в случае отладки гораздо удобнее получить "жёлтую страницу", чтобы понять причину
            throw new Exception("Тестовая ошибка!");
 
 
        }
        catch (Exception ex)
        {
            // вывод краткой информации об ошибке
            lbTest.Text = "Перехвачена ошибка! Тескт: " + ex.Message;
        };
        
#endif
    }
}
0
23 / 23 / 3
Регистрация: 24.02.2010
Сообщений: 105
28.10.2011, 11:29  [ТС] 3
Цитата Сообщение от leonidSDF Посмотреть сообщение
может так
...
Так не пойдёт, т.к. код на месте "// здесь какой-либо код, который может привести к генерации исключения" должен выполняться и при дебаге, и при релизе. Это часть основного кода.
0
374 / 135 / 19
Регистрация: 16.07.2010
Сообщений: 342
28.10.2011, 11:58 4
Вместо #if в данном случае нужно использовать #ifdef
0
23 / 23 / 3
Регистрация: 24.02.2010
Сообщений: 105
28.10.2011, 12:04  [ТС] 5
Цитата Сообщение от Ereona Посмотреть сообщение
Вместо #if в данном случае нужно использовать #ifdef
#ifdef компилятор не воспринимает. Скорее всего он используется в C++, но не в C#.
0
374 / 135 / 19
Регистрация: 16.07.2010
Сообщений: 342
28.10.2011, 12:10 6
Прошу прощения, перепутала. У нас это сделано так, и работает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#if !DEBUG
            try
            {
#endif
            executeAction(msg_id, sender, args);
#if !DEBUG
            }
            catch(CActionFailedException)
            {
                throw;
            }
            catch (CReadableException e)
            {
                e.showException();
            }
            catch (CAppException e)
            {
                e.log();
            }
            catch (Exception e)
            {
                CReadableException re = new CReadableException(1001, e);
                re.showException();
            }
#endif
А по второму вопросу - в свойствах проекта на вкладке Build есть галочка define DEBUG constant, может быть, это то, что нужно.
0
23 / 23 / 3
Регистрация: 24.02.2010
Сообщений: 105
28.10.2011, 12:43  [ТС] 7
Цитата Сообщение от Ereona Посмотреть сообщение
Прошу прощения, перепутала. У нас это сделано так, и работает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#if !DEBUG
            try
            {
#endif
            executeAction(msg_id, sender, args);
#if !DEBUG
            }
            catch(CActionFailedException)
            {
                throw;
            }
            catch (CReadableException e)
            {
                e.showException();
            }
            catch (CAppException e)
            {
                e.log();
            }
            catch (Exception e)
            {
                CReadableException re = new CReadableException(1001, e);
                re.showException();
            }
#endif
А по второму вопросу - в свойствах проекта на вкладке Build есть галочка define DEBUG constant, может быть, это то, что нужно.
Спасибо за ответ. По второму вопросу - в ASP.NET проектах нет как таковых свойств проекта, в основном всё настраивается через web.config. Во всяком случае галочки такой я нигде не нашёл... А насчёт кода у себя проверил - тоже не работает. По сути это то же самое, только более удобочитаемо (не знал, что можно использовать #if !DEBUG, поэтому делал через #else). Специально создал проект консольного приложения по виду Вашего примера - не работает. Думал, может, в ASP'е только такое. Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define DEBUG
 
using System;
 
namespace TestCon35
{
    class Program
    {
        static void Main(string[] args)
        {
            {
#if !DEBUG
            try
            {
#endif
                throw new Exception("Oops!");
#if !DEBUG
            }
            catch(Exception ex)
            {
                Console.WriteLn("Перехвачена ошибка! Текст: " + ex.Message);
            }
#endif
            }
        }
    }
}
Опять исключение генерируется всегда, независимо от того, присутствует #define DEBUG в первой строке или нет.
0
374 / 135 / 19
Регистрация: 16.07.2010
Сообщений: 342
28.10.2011, 12:54 8
В консольном приложении у меня эта ошибка перехватывается, если, как я писала выше, в свойствах проекта убрать define DEBUG constant или собрать в конфигурации Release. Не знаю, как это в ASP.NET.
0
69 / 69 / 12
Регистрация: 09.08.2011
Сообщений: 116
Записей в блоге: 1
28.10.2011, 13:08 9
А что мешает включить автоматический отлов ошибок в Visual Studio
Debug ->Exceptions
Включение/выключение try/catch по условию на этапе компиляции. Возможно ли это?
0
374 / 135 / 19
Регистрация: 16.07.2010
Сообщений: 342
28.10.2011, 13:15 10
Masia_March, по-моему, это немного другое. Если это включить, то отладчик будет останавливаться вообще на всех исключениях, даже на тех, которые заключены в try-catch и успешно обрабатываются самим приложением.
0
23 / 23 / 3
Регистрация: 24.02.2010
Сообщений: 105
28.10.2011, 13:40  [ТС] 11
Цитата Сообщение от Ereona Посмотреть сообщение
В консольном приложении у меня эта ошибка перехватывается, если, как я писала выше, в свойствах проекта убрать define DEBUG constant или собрать в конфигурации Release. Не знаю, как это в ASP.NET.
Да, действительно, всё дело в свойствах проекта и #define DEBUG в начале кода не оказывает никакого влияния.

Masia_March, Мешает то, что проект в основном отлаживается на удалённом сервере, т.к. присутствуют модули на обычном asp и хранить всё это (и запускать в режиме отладки) на моём компьютере проблематично.
0
23 / 23 / 3
Регистрация: 24.02.2010
Сообщений: 105
31.10.2011, 13:55  [ТС] 12
Прошу прощения, что апаю тему, но вопрос всё же довольно важный и актуальный. Получается нет нормального решения задачи с динамическим включением/отключением перехвата исключений в ASP.NET? Может, кто-нибудь сталкивался с такой необходимостью... Ведь не всегда получается запускать и отлаживать большие проекты на локальном компьютере, используя встроенный дебагер. А с частой выкладкой обновлений постоянные закомментирования блоков try/catch и удаление этих комментариев после обновления или исправления сильно надоедают.
0
23 / 23 / 3
Регистрация: 24.02.2010
Сообщений: 105
11.07.2012, 14:30  [ТС] 13
Просматривал тут свои неотвеченные вопросы и наткнулся на эту тему. Если кому интересно, то решение было найдено. Проблема решается просто:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// #define DEBUG
// DEBUG проставляется в завизимости от настройки конфигураций (Release/Debug по-умолчанию)
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            // здесь какой-либо код, который может привести к генерации исключения
            // и в случае отладки гораздо удобнее получить "жёлтую страницу", чтобы понять причину
            throw new Exception("Тестовая ошибка!");
        }
        catch (Exception ex)
        {
#if DEBUG
            throw e;
#endif
            // вывод краткой информации об ошибке
            lbTest.Text = "Перехвачена ошибка! Тескт: " + ex.Message;
        };
    }
}
2
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
11.07.2012, 15:11 14
Цитата Сообщение от mrBlade Посмотреть сообщение
C#
1
throw e;
Только e уберите оттуда, оставьте просто throw.
В противном случае у вас ко всем чертям летит снапшот стека.
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
11.07.2012, 15:18 15
kolorotur, опечатка наверное, исключение то "ex" называется
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
11.07.2012, 17:27 16
Цитата Сообщение от Yukikaze Посмотреть сообщение
опечатка наверное
Возможно.
Тогда встает вопрос: опечатка в чем? В недостатке "x" или в лишней "e"?
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
12.07.2012, 00:42 17
kolorotur, а вы батенька гурман
0
23 / 23 / 3
Регистрация: 24.02.2010
Сообщений: 105
12.07.2012, 13:44  [ТС] 18
Да, конечно, это была опечатка, т.к. дописывал просто в тексте. Заключается она в недостатке "x" На самом деле штука очень удобная, стал использовать практически во всех проектах. Главное перед паблишем не забывать переключить с дебага на релиз, а то совсем некрасиво получится, если вылетает исключение. Особенно в службе WCF, которая потихому закрывается в случае неперехваченного исключения
0
12.07.2012, 13:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.07.2012, 13:44
Помогаю со студенческими работами здесь

Ошибка на этапе компиляции
Добрый вечер. Ребят помогите, не могу понять в чем дело. Есть программа в которой описан 1 класс...

Включение и выключение кнопки
Что и где нужно воткнуть, чтоб после нажатия на кнопку она становилась недоступной? То есть,...

Выключение и включение устройства
Есть вот такой код: prior bvariable (P1=1) 'AND' (P2=2) ;Проверяем значения в ячейках type1...

Включение/выключение по графику
Доброго времени суток! Хотел узнать есть ли возможность вкл/выкл сервер по графику (на ночь...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru