Обработка исключений и ведение журнала регистрации ошибок.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Обработка исключений и ведение журнала регистрации ошибок.

Обработка исключений и ведение журнала регистрации ошибок.

Ответ
Поиск в этой теме
Непрочитано 21.01.2010, 12:16 #1
Обработка исключений и ведение журнала регистрации ошибок.
hwd
 
C, C++, C#
 
С-Пб.
Регистрация: 07.10.2009
Сообщений: 2,762

Хочу записывать в журнал сообщения об ошибках, возникших в процессе работы приложения. Однако получаю два неприятных момента:
1. Автокад сам не отправляет на консоль информации о произошедшей ошибки (с этим еще можно смириться, делая сие за него).
2. Блок try/catch не отлавливает возникающую ошибку (а вот это уже серьёзно, т.к. в данной ситуации отправить сообщение об ошибке за Автокад не удалось).
Код:
[Выделить все]
...
    public class XDataTest
    {
        Document dwg;
        Database db;
        Editor ed;
        StreamWriter sw;

        public XDataTest()
        {
            
            dwg = acad.DocumentManager.MdiActiveDocument;
            db = dwg.Database;
            ed = dwg.Editor;
            FileInfo errorReport = new FileInfo("ErrorReport.txt");
            sw = errorReport.CreateText();
            Console.SetError(sw);
        }

        ~XDataTest()
        {
            sw.Dispose();
        }
...

        [Description("Назначение выбранному пользователем объекту расширенных данных")]
        [CommandMethod("w2")]
        public void SetXData()
        {
            PromptEntityOptions msg = new PromptEntityOptions("Выберите объект, к которому хотите добавить расширенные данные:");
            PromptEntityResult res = ed.GetEntity(msg);
            if (res.Status == PromptStatus.OK)
            {
                using (Transaction trans = dwg.TransactionManager.StartTransaction())
                {
                    DBObject obj = trans.GetObject(res.ObjectId, OpenMode.ForWrite);
                    PromptStringOptions pr = new PromptStringOptions(Environment.NewLine + "Имя приложения: ");
                    Console.Error.Write("Проверка связи с журналом регистрации ошибок...");
                    try
                    {
                        pr.Keywords.Add("Список");//Здесь получаю исключение, мол "ключевые слова не разрешены". Однако блок "try" не отлавливает ошибку.
                        //...
                    }
                    catch (System.Exception ex)
                    {
                        Console.Error.Write(ex.Message);
                    }
                    PromptResult strRes = ed.GetString(pr);

                    ResultBuffer resBuf = new ResultBuffer(new TypedValue(1001, strRes.StringResult), new TypedValue(1005, "MyCircle"), new TypedValue(1000, "qwerty121212121212"));
                    obj.XData = resBuf;
                    resBuf.Dispose();
                    trans.Commit();
                }
            }
        }
...
В результате работы кода, автокад выдаёт окно с сообщением мол ошибка и т.п., а в файле журнала будет записано только "Проверка связи с журналом регистрации ошибок...".
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 21.01.2010 в 12:23.
Просмотров: 4923
 
Непрочитано 21.01.2010, 20:19
#2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от hwd Посмотреть сообщение
Хочу записывать в журнал сообщения об ошибках, возникших в процессе работы приложения....В результате работы кода, автокад выдаёт окно с сообщением мол ошибка и т.п., а в файле журнала будет записано только "Проверка связи с журналом регистрации ошибок...".
Только идея, не проверял
Вместо
Код:
[Выделить все]
catch (System.Exception ex)
попробуй
Код:
[Выделить все]
catch (Autodesk.AutoCAD.Runtime.Exception ex)
~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 21.01.2010, 21:47
#3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Только идея, не проверял
Вместо
Код:
[Выделить все]
catch (System.Exception ex)
попробуй
Код:
[Выделить все]
catch (Autodesk.AutoCAD.Runtime.Exception ex)
~'J'~
я это уже проверял - результат тот же.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 21.01.2010, 22:14
#4
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от hwd Посмотреть сообщение
я это уже проверял - результат тот же.
Насчет этого ничего не могу сказать
А если нужно избежать вышеозначенной ошибки
нужно добавитьчто-то вроде:

Код:
[Выделить все]
pr.AppendKeywordsToMessage = True
~'J'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 22.01.2010, 16:41
#5
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Насчет этого ничего не могу сказать
А если нужно избежать вышеозначенной ошибки
нужно добавитьчто-то вроде:
Код:
[Выделить все]
pr.AppendKeywordsToMessage = True
~'J'~
Код:
[Выделить все]
        [Description("Назначение выбранному пользователем объекту расширенных данных")]
        [CommandMethod("w2")]
        public void SetXData()
        {
            PromptEntityOptions msg = new PromptEntityOptions("Выберите объект, к которому хотите добавить расширенные данные:");
            PromptEntityResult res = ed.GetEntity(msg);
            if (res.Status == PromptStatus.OK)
            {
                using (Transaction trans = dwg.TransactionManager.StartTransaction())
                {
                    DBObject obj = trans.GetObject(res.ObjectId, OpenMode.ForWrite);
                    PromptStringOptions pr = new PromptStringOptions(Environment.NewLine + "Имя приложения: ");
                    Console.Error.Write("Проверка связи с журналом регистрации ошибок...");
                    try
                    {
                        pr.AppendKeywordsToMessage = true;                        
                        pr.Keywords.Add("Список");//Здесь получаю исключение, мол "ключевые слова не разрешены". Однако блок "try" не отлавливает ошибку.
                        //...
                    }
                    catch (System.Exception ex)
                    {
                        Console.Error.Write(ex.Message);
                    }
                    PromptResult strRes = ed.GetString(pr);

                    ResultBuffer resBuf = new ResultBuffer(new TypedValue(1001, strRes.StringResult), new TypedValue(1005, "MyCircle"), new TypedValue(1000, "qwerty121212121212"));
                    obj.XData = resBuf;
                    resBuf.Dispose();
                    trans.Commit();
                }
            }
        }

Да и ещё проблема:
Режим отладки (Debug). Установлены "брэйкпоинты". В свойствах проекта, на вкладке Debug, указан запуск AutoCAD. Жму F5, запускается AutoCAD, в котором произвожу загрузку этой библиотеки определённой командой. "Брэйкпоинты" не срабатывают.

Делаю иначе:
Запускаю AutoCAD. В отладчике Visual Studio запускаю "Attach to process..." Указываю нужный процесс... В результате безнадёжно зависает как студия, так и автокад.
__________________________________________
p.s. win 7 x64 rus; vis. studio 2010 beta 2 x64.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 22.01.2010, 16:59
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


А если вместо:
Код:
[Выделить все]
               
catch (System.Exception ex)
{
     Console.Error.Write(ex.Message);
}
использовать
Код:
[Выделить все]
catch
{
     Console.Error.Write("Error!!!");
}
А вообще это все крайне странно. Судя по протоколу возбуждается исключение System.InvalidOperationException, которое унаследовано от System.Exception, так что catch должен был сработать. Возможно это проблема VS 2010 Beta.

Последний раз редактировалось Александр Ривилис, 22.01.2010 в 17:11.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 22.01.2010, 17:04
#7
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
А если
Код:
[Выделить все]
catch
{
     Console.Error.Write("Error!!!");
}
Т.е. вы предполагаете, что в случае ошибки автокад просто не отправляет сообщения? )
Попробовал... результат - тот же.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 22.01.2010, 17:18
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
Т.е. вы предполагаете, что в случае ошибки автокад просто не отправляет сообщения? )
Попробовал... результат - тот же.
В том то и дело что AutoCAD сообщение отправляет (это видно в окне Exception), а вот catch его не перехватывает.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 22.01.2010, 17:32
#9
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
В том то и дело что AutoCAD сообщение отправляет (это видно в окне Exception), а вот catch его не перехватывает.
я имел в виду отправку сообщения об ошибке на консоль.

т.е. имею две проблемы:
1. блок try/catch не отлавливает исключение
2. несмотря на pr.AppendKeywordsToMessage = true;

получаю ошибку, мол ключевые слова не разрешены.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 22.01.2010, 17:52
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Посмотри может это поможет: http://through-the-interface.typepad...ng-except.html
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Обработка исключений и ведение журнала регистрации ошибок.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ведение журнала производства работ Евгений_Анатольевич Прочее. Архитектура и строительство 22 24.11.2021 21:48