Страница 2 из 2

Re: Ошибка при компиляции отчета

Добавлено: 19 авг 2015, 12:48
HighAley
Здравствуйте, Дмитрий.

У нас есть внутренние исключения, которые мы ловим сами. Также могут возникать исключения, которые возникают в используемых нами системных библиотеках, в пользовательских сборках или скриптах. Иногда и такие возникают.
что несколько затрудняет интеграцию Ваших компонентов.
Не могли бы вы уточнить чем именно это затрудняет интеграцию?

Спасибо.

Re: Ошибка при компиляции отчета

Добавлено: 19 авг 2015, 13:23
DmitryRu
Здравствуйте.

Если Вы ловите сами свои исключения, очевидно, у вас код выглядит так:

Код: Выделить всё

  try {
   doSmth();
  } catch (Exception e) {
    ....
  }
Очевидно - потому что у вас в коде, судя по всему, везде генерируется именно Exception, примерно так:

Код: Выделить всё

      if (options == null)
        throw new Exception("Failed to initialize the StiMvcViewer component. Please define the StiMvcViewerOptions to work correctly with the viewer.");
Если вы замените в каком-либо своем коде этот код на примерно такой:

Код: Выделить всё

   public class StimulsoftException: Exception{
     //constructors here
   }

Код: Выделить всё

      if (options == null)
        throw new StimulsoftException("Failed to initialize the StiMvcViewer component. Please define the StiMvcViewerOptions to work correctly with the viewer.");
то ни один ваш catch не сломается, ибо сейчас вы все равно вынуждены писать catch(Exception)

Зато вот как раз вам будет легче отличать свои исключения от
исключений, которые возникают в используемых нами системных библиотеках, в пользовательских сборках или скриптах.
Не могли бы вы уточнить чем именно это затрудняет интеграцию?
О трудностях интеграции я писал на предыдущей странице.
Сейчас у меня, для решения проблем с компиляцией отчетов, написан следующий код:

Код: Выделить всё

                try
                {
                    report.Compile(fileName, StiOutputType.ClassLibrary);
                }
                catch (IOException)
                {
                    throw;//наверняка нет прав доступа
                }
                catch (Exception e)
                {
                    HandleMrtCompilationError(fileName, e, report);
                }
Однако, я не могу быть уверен, что в я не перехватываю не релевантные исключения, например, OutOfMemory.
Если бы я мог написать так:

Код: Выделить всё

                try
                {
                    report.Compile(fileName, StiOutputType.ClassLibrary);
                }
                catch (StimulsoftException e)
                {
                    HandleMrtCompilationError(fileName, e, report);
                }
можно было бы быть уверенным, что сломалась именно компиляция отчета, а не что-то другое.
Заметьте, в таком варианте еще и убираются лишние секции catch() - они неизбежны при текущей реализации, throw new Exception()

Re: Ошибка при компиляции отчета

Добавлено: 19 авг 2015, 14:43
HighAley
Здравстуйте.

Что касается метода Compile(). Там нету наших исключений. Все исключения -- системные.
В нашем движке отчётов все исключения ловятся в нашем коде.
А те исключения, которые вы указали в StiMvcViewer, возникают для разработчика. Они возникают в том случает, когда не заданы StiMvcViewerOptions, но в этом случае Вьювер не будет работать вообще. Данную проблему надо исправить и она больше не возникнет. Это не то исключение, которое может возникнуть в продакшене.

Спсибо.

Re: Ошибка при компиляции отчета

Добавлено: 19 авг 2015, 15:05
DmitryRu
Что касается метода Compile(). Там нету наших исключений. Все исключения -- систумные.
Решарпер декомпилирует этот метод примерно так:

Код: Выделить всё

    private void Compile(string path, Stream stream, StiOutputType outputType, bool autoCreate, object standaloneReportType)
    {
.......
      StiOptions.Engine.GlobalEvents.InvokeReportCompiling((object) this, EventArgs.Empty);
      if (!string.IsNullOrEmpty(path) && System.IO.File.Exists(path))
        System.IO.File.Delete(path);
      if (!this.NeedsCompiling)
        throw new Exception("Report already compiled");
      if (stream != null && string.IsNullOrEmpty(path))
      {
        string environmentVariable = Environment.GetEnvironmentVariable("Temp");
        if (environmentVariable == null)
          throw new Exception("Can't get Temp directory");
.......
        if (!this.IsDesigning)
          throw new Exception(stringBuilder.ToString());
И вот эти "throw new Exception" мне и повстречались.

Спасибо

Re: Ошибка при компиляции отчета

Добавлено: 20 авг 2015, 08:27
DmitryRu
Aleksey Andreyanov писал(а):Здравстуйте.
В нашем движке отчётов все исключения ловятся в нашем коде.
Здравствуйте.
Да, действительно, пока я разбирался с какой-то проблемой, я видел у вас примерно такой код:

Код: Выделить всё

  public void StimulsoftMethod(){
    try{
      SomePrivateMethod();
    } catch (Exception e) {
      // и здесь тупо ничего нет, просто проглатывается исключение
    }
  }
Так писать категорически нельзя, об этом написано в любом учебнике.
Очень хорошо, что метод Compile сделан не так, и у меня получилось разобраться в чем проблема, всего-то за пару дней.
Если бы исключение возникало в приватном Compile и глоталось бы в вашем коде, сроки решения проблемы выросли бы до неприемлемых.

А причина такого проглатывания примерно понятна - она в том, что вы не создаете свои подклассы от Exception. И это тоже порицается учебниками.

В любом случае,
спасибо за оперативную техподдержку.

Re: Ошибка при компиляции отчета

Добавлено: 20 авг 2015, 09:31
HighAley
Здравствуйте.

Для начала начнём с того, что декомпиляция нашего кода запрещена лицензионным соглашением.

А реальная жизнь далека от учебников. Иногда приходится глотать непредвиденные исключения, который могут возникнуть из-за неправильных действий пользователя.

В книжках написано, кто сборщик мусора сам очищает память. В действительности же в большинстве случаев приходится освобождать память вручную.

Данная беседа заходит в философскую область и считаю, что на это её можно прекратить.

Спасибо.