Сохраните сообщения ошибки на выходе в файл в MATLAB

Существует ли способ сохранить сообщения об ошибках MATLAB в файл?

Это может быть простой проблемой, но Google не мог дать мне ответ. Я скомпилировал исполняемый файл GUI для использования без лицензии MATLAB, и иногда замораживается. В эстетических целях я подавил окно команд, обычно сопровождающее такой исполняемый файл, таким образом, я не могу вывести сообщение об ошибке через командную строку. Я хотел бы иметь возможность создать журнал ошибок, который может быть послан по электронной почте мне для отладки.

Спасибо!

12
задан Doresoom 16 December 2009 в 23:17
поделиться

3 ответа

Используйте команду "дневник" для создания файла журнала. Это заставит Matlab записать копию всего вывода командной строки в файл, включая предупреждения, сообщения об ошибках и трассировку стека для необработанных исключений. Sendmail () может отправить его вам при ошибках. Если вы хотите сэкономить место, вы можете заставить программу удалять свой файл журнала при нормальном (без ошибок) выходе из программы.

IMHO, это предпочтительнее, чем использование «try ... catch; ошибки записи; end ", потому что:

  • Он перехватит все неперехваченные ошибки, включая исключения Java, вызванные потоком AWT, и ошибки обратных вызовов M-кода в вашем графическом интерфейсе, что может быть трудно получить try / catch.
  • Если Matlab является сбои сильно, как с segfault, на уровне M-кода try / catch его не поймают. Но файл дневника может по-прежнему записывать дамп segfault.
  • Вы можете выдавать сообщения о ходе выполнения, информацию об отладке и предупреждения, чтобы дать больше информация о поведении вашей программы, приводящей к ошибкам, и все они будут зафиксированы.
  • Мне нравится, чтобы код в блоках catch был минимальным.

Также есть опция командной строки, которая делает то же самое, я не знаете, как вызвать это для скомпилированного Matlab.

включая исключения Java, возникающие из потока AWT, и ошибки из обратных вызовов M-кода в вашем графическом интерфейсе, что может быть трудно получить try / catch.
  • Если Matlab сильно вылетает, например, с segfault, попробуйте на уровне M-кода / catch не поймает. Но файл дневника может по-прежнему записывать дамп segfault.
  • Вы можете выдавать сообщения о ходе выполнения, информацию об отладке и предупреждения, чтобы предоставить дополнительную информацию о поведении вашей программы, приводящей к ошибкам, и все они будут записаны.
  • Мне нравится, чтобы код в блоках catch был минимальным.
  • Также есть параметр командной строки, который выполняет аналогичные функции; Я не знаю, как вызвать это для скомпилированного Matlab.

    включая исключения Java, возникающие из потока AWT, и ошибки из обратных вызовов M-кода в вашем графическом интерфейсе, что может быть трудно получить try / catch.
  • Если Matlab сильно вылетает, например, с segfault, попробуйте на уровне M-кода / catch не поймает. Но файл дневника может по-прежнему записывать дамп segfault.
  • Вы можете выдавать сообщения о ходе выполнения, информацию об отладке и предупреждения, чтобы предоставить дополнительную информацию о поведении вашей программы, приводящей к ошибкам, и все они будут записаны.
  • Мне нравится, чтобы код в блоках catch был минимальным.
  • Также есть параметр командной строки, который выполняет аналогичные функции; Я не знаю, как вызвать это для скомпилированного Matlab.

    Но файл дневника может по-прежнему записывать дамп segfault.
  • Вы можете выдавать сообщения о ходе выполнения, информацию об отладке и предупреждения, чтобы предоставить дополнительную информацию о поведении вашей программы, приводящей к ошибкам, и все они будут записаны.
  • Я предпочитаю, чтобы код в блоках catch был минимальным.
  • Также есть опция командной строки, которая выполняет аналогичные функции; Я не знаю, как вызвать это для скомпилированного Matlab.

    Но файл дневника может по-прежнему записывать дамп segfault.
  • Вы можете выдавать сообщения о ходе выполнения, информацию об отладке и предупреждения, чтобы предоставить дополнительную информацию о поведении вашей программы, приводящей к ошибкам, и все они будут записаны.
  • Я предпочитаю, чтобы код в блоках catch был минимальным.
  • Также есть опция командной строки, которая выполняет аналогичные функции; Я не знаю, как вызвать это для скомпилированного Matlab.

    11
    ответ дан 2 December 2019 в 05:15
    поделиться

    Используйте операторы try ... catch вокруг кода. В блоке catch вы можете записать ошибку, включая информацию о стеке. Используя sendmail, вы даже можете заставить код уведомлять вас об ошибках по почте (в идеале с помощью всплывающего окна, которое позволяет пользователям решить, хотят ли они поделиться с вами информацией о сбое)

    try
       % your code here
    catch err
       %open file
       fid = fopen('logFile','a+');
       % write the error to file
       % first line: message
       fprintf(fid,'%s\n',err.message);
    
       % following lines: stack
       for e=1:length(err.stack)
          fprintf(fid,'%sin %s at %i\n',txt,err.stack(e).name,err.stack(e).line);
       end
    
       % close file
       fclose(fid)
    end 
    

    Отредактировано, чтобы быть более подробным о том, как писать ошибку сообщение в файл

    12
    ответ дан 2 December 2019 в 05:15
    поделиться

    Для более старых версий MATLAB вы можете использовать функцию LASTERROR , чтобы получить информацию о самой последней ошибке, выпущенной MATLAB. Однако в новых версиях MATLAB эта функция будет постепенно исключена.

    Для более новых версий MATLAB я бы предложил использовать класс MException для захвата информации об ошибках . Вы можете поймать объект MException с помощью блока try-catch , как Джонас предложил , либо вы можете потенциально использовать статический метод MException.last , чтобы получить последнее неперехваченное исключение (в зависимости от того, как вы запускаете свой код):

    %# OPTION 1:
    %# --------
    try
      my_code();
    catch ME
      %# Save data in ME to file
    end
    %# OPTION 2:
    %# --------
    my_code();
    ME = MException.last;
    %# Save data in ME to file
    

    Каким бы способом вы ни захватили объект MException, вы можете использовать MException.

    3
    ответ дан 2 December 2019 в 05:15
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: