Выбрать главу

Ряд s может содержать '\n', символы новой строки, поэтому ваше сообщение легко сделать исчерпывающе подробным, причем на вашем родном языке, а не на английском, на котором Euphoria выводит свои собственные сообщения. Перед выводом вашего сообщения Euphoria переключит экран в текстовый режим и начнет печать с верхней строки чистого экрана.

Вы можете вызывать crash_message() столько раз из различных участков вашей программы, сколько это необходимо. Будет выведено только одно сообщение, то, которое задано последним перед точкой возникновения ошибки.

Пример:

crash_message("Произошла неизвестная ранее ошибка!\n" &

"Свяжитесь с john_doe@whoops.com\n" &

"Не удаляйте файл \"ex.err\".\n")

См. также:

abort, crash_file, crash_routine, отладка и профилирование

crash_routine

Синтаксис:

include machine.e

crash_routine(i)

Описание:

Задаёт номер аварийной функции, которая, по вашему замыслу, должна быть вызвана Euphoria в случае обнаружения ошибки, из-за которой работа вашей программы прервалась бы с аварийным сообщением. Ваша аварийная функция должна иметь один аргумент типа object. Этот аргумент в настоящее время автоматически всегда равен 0 (рассматривается возможность наличия в будущих выпусках Euphoria и более содержательных аргументов). Вы можете вызывать crash_routine много раз с различными аварийными функциями. В момент, когда Euphoria должна была бы прервать вашу программу, будет вызвана та ваша аварийная функция, которая задана в самой последней команде crash_routine(), а затем начнётся отработка всей цепочки аварийных функций по направлению к вызванной в первой команде crash_routine(). Обычно каждая из предусмотренных аварийных функций должна выдавать 0. Если любая из функций этой цепочки выдаст не-нулевую величину, цепочка вызовов будет немедленно прервана, а программа завершена с сообщением об аварийной остановке (авосте).

Комментарии:

Определяя аварийные функции, вы даёте своей программе шанс отреагировать на фатальные ошибки (такие, например, как индекс вне границ), возникающие во время её работы, наиболее безопасным для ваших данных способом. Вы можете записать некоторые критичные данные на диск. Вы можете проинформировать пользователя о том, что случилось и что он должен в первую очередь сделать. Вы можете также записать ключевую отладочную информацию. Фактически, когда ваша аварийная функция вызвана, файл ex.err уже будет записан. Ваша функция может перезаписать ex.err ещё где-то, или даже открыть его и извлечь из него необходимую информацию, например, сообщение об ошибке.

Команда crash_routine() может использоваться с интерпретатором или транслятором. Транслированный код не выполняет широкую проверку ошибок во время работы программы и не обеспечивает полную распечатку в ex.err, но исключения машинного уровня фиксируются, и crash_routine() дает вам превосходную возможность записать некоторые переменные на диск для использования при дальнейшей отладке.

Разработчику библиотеки может понадобиться вызов crash_routine() в библиотеке. Это позволит более упорядоченно обращаться с данными, закрывая файлы, отпирая запертые файлы, высвобождая ресурсы и т.п. Но разработчик главной программы может иметь и свои собственные crash_routine(). И все аварийные функции будут отработаны Euphoria, если первая вызванная (последняя назначенная) и все последующие выдадут 0.

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

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

Пример:

function crash(object x)

-- в случае пожара ...

-- (под Linux) отправить сообщение e-mail, содержащее файл ex.err

system("mail -s \"crash!\" myname@xxx.com < ex.err > /dev/null", 2)

return 0

end function

crash_routine(routine_id("crash"))

См. также:

abort, crash_file, crash_message, отладка и профилирование

current_dir

Синтаксис:

include file.e

s = current_dir()

Описание:

Выдаёт имя текущего рабочего каталога (директории, папки, фолдера).

Комментарии:

После имени текущего каталога не будет ни косой черты, ни обратной косой черты, за исключением случая под DOS/Windows, в корневом каталоге диска, где вы получите, например, C:\

Пример:

sequence s

s = current_dir()

-- s будет равно "C:\EUPHORIA\DOC", если вы находитесь в этом каталоге

См. также:

dir, chdir, getenv

cursor

Платформа:

WIN32, DOS32

Синтаксис:

include graphics.e

cursor(i)

Описание:

Задаёт форму курсора. Библиотека graphics.e содержит глобальные константы:

global constant NO_CURSOR = #2000,

UNDERLINE_CURSOR = #0607,

THICK_UNDERLINE_CURSOR = #0507,

HALF_BLOCK_CURSOR = #0407,

BLOCK_CURSOR = #0007

Вторая и четвертая шестнадцатиричные цифры (слева) дают номера верхнего и нижнего рядов пикселов в изображении курсора. От первой цифры зависит, будет курсор видимым или нет. Например, #0407 включает с 4-го по 7-ой ряд пикселов.

Комментарии:

В пиксельных экранных режимах курсор не отображается, только в текстовых.

Пример:

cursor(BLOCK_CURSOR)

См. также:

graphics_mode, text_rows

custom_sort

Синтаксис:

include sort.e

s2 = custom_sort(i, s1)

Описание:

Сортирует элементы ряда s1, используя заданную сравнивающую функцию с номером (идентификатором) i. Выдаёт отсортированный ряд.

Комментарии:

Заданная вами заказная сравнивающая функция должна быть функцией двух аргументов наподобие Euphoria-функции compare(). Она должна сравнивать два объекта и выдавать -1, 0 или +1.

Пример программы:

demo\csort.ex

См. также:

sort, compare, routine_id

date

Синтаксис:

s = date()

Описание:

Выдаёт ряд со следующей информацией:

{год, -- начиная с 1900

месяц, -- январь = 1

день, -- день месяца, начиная с 1

час, -- от 0 до 23

минута, -- от 0 до 59

секунда, -- от 0 до 59

день недели, -- воскресенье = 1

день года} -- 1 января = 1

Пример: