Ошибки daysper

Последняя правка 3791 день назад
Материал из Daysper manual
Перейти к навигации Перейти к поиску

В daysper бывают ошибки двух видов: ошибки на этапе работы самого daysper и ошибки на этапе запуска скрипта, созданного daysper (в соответствии с Идея: трансляция в скрипты). Ошибки первого типа могут возникнуть в любой команде, ошибки второго типа — конечно, только в командах, которые выполняются путем создания и запуска скрипта. Ошибки второго типа возникают, конечно, за счет того, что в скрипт daysper вставил контроль успешности операций.

Ошибки на этапе работы daysper[править | править код]

Такие ошибки выдаются на экран в следующем формате:

An error occured in source/ScriptTranslator.cpp:54 in function void daysper::ScriptTranslator::translate() :
check 'false' failed:

In daysper script file do_all.d:15:1: Unknown command 'genrnd'
If you intended to run a file, you should compile it first

или

An error occured in source/Checker.cpp:38 in function std::vector<int, std::allocator<int> > daysper::Checker::parseTestSet(std::string) :
check 'vv1<=vv2' failed:

Tests range 3-1 is invalid

и состояит из двух частей:

  • в первой и второй строке — служебная информация, указывающая функцию в исходниках daysper, в которой произошла ошибка, и проверку, которая оказалась неверна. Проверка может быть или false (как в первом примере выше), обозначающая, что daysper попал в часть кода, куда он никогда не должен попадать, или что-нибудь более информативное (например, vv1<=vv2 во втором примере выше, указывающее, что vv1 должно было быть не больше vv2)
  • после пустой строки — основное сообщение об ошибке, как правило, указывающее, в чем именно проблема (в первом примере выше указано, что на в файле do_all.d строке 15 в позиции 1 встретилась неизвестная команда genrnd). Нередко это сообщение также содержит возможные причины ошибки (в примере выше указано, что перед запуском файла в .d-скрипте должна присутствовать команда compile).

Ошибки на этапе выполнения скрипта[править | править код]

Daysper создает скрипт так, чтобы он проверял коды возврата некоторых команд (не всех, но тех, которые чаще могут не сработать, например, компиляции программ и запуска чекера; в дальнейших версиях daysper, возможно, будут проверяться и другие команды). Подобные ошибки daysper делит на два типа: фатальные и нефатальные.

Фатальные ошибки[править | править код]

Фатальные ошибки — ошибки, которые происходит там, где их, по идее, быть не должно никогда. Например, если ненулевой код возвращает компилятор, или чекер, запущенный на правильном ответе в команде build, или валидатор, или другой скрипт, запускаемый при рекурсивной генерации задач. В таком случае скрипт вылетает с сообщением вида:

'fpc -Mdelphi -FE. -Fu..\..\..\res\testlib ..\aplusb_pk.pas' returned non-zero exit code!
An error occured! Exiting

Сообщение состоит из двух строк:

  • первая указывает команду, которая вернула ненулевой код возврата,
  • вторая всегда имеет вид An error occured! Exiting.

Как правило, выше этого сообщения об ошибке на экране оказывается вывод этой команды (в примере выше — вывод fpc), из которого обычно ясно, в чем проблема.

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

Нефатальные ошибки[править | править код]

Нефатальные ошибки — ошибки (ненулевые коды возврата), которые не обязательно свидетельствуют о чем-то неправильном. Например, при проверке решения по команде check чекер вполне может вернуть ненулевой код возврата (если проверяется решение, которое намеренно неправильное). В таком случае скрипт не вылетает, а информация об ошибке выводится в файл _daysper.log в виде

Test 1: 'check ..\tests-ready\01 aplusb.out ..\tests-ready\01.a' returned non-zero exit code 

При этом в конце работы скрипт выведет сообщение

There were some errors; see _daysper.log

При рекурсивной обработке задач после завершения работы скрипта для подкаталога содержимое файла _daysper.log этого подкаталога переписывается в файл _daysper.log текущего каталога, благодаря чему в конце работы все сообщения об ошибках оказываются в файле _daysper.log того каталога, откуда был запущен daysper в следующем виде:

Dir ./aplusb  
Test 1: 'check ..\tests-ready\01 aplusb.out ..\tests-ready\01.a' returned non-zero exit code 
Test 2: 'check ..\tests-ready\02 aplusb.out ..\tests-ready\02.a' returned non-zero exit code 
Test 3: 'check ..\tests-ready\03 aplusb.out ..\tests-ready\03.a' returned non-zero exit code 
Test 4: 'check ..\tests-ready\04 aplusb.out ..\tests-ready\04.a' returned non-zero exit code 
Dir ./aplusb2  
Test 1: 'check ..\result\01 aplusb.out ..\result\01.a' returned non-zero exit code 
Test 2: 'check ..\result\02 aplusb.out ..\result\02.a' returned non-zero exit code 
Test 3: 'check ..\result\03 aplusb.out ..\result\03.a' returned non-zero exit code 
Test 4: 'check ..\result\04 aplusb.out ..\result\04.a' returned non-zero exit code