to post messages and comments.

← All posts tagged exceptions

Самая проблемная (как сейчас представляется) часть совмещения библиотек для разных OS — это исключения и сигналы, которые конвертируются в исключения разных языков программирования. Виндоуз в этом плане очень продумана, по крайней мере, 32-разрядная и более поздние. Там общая для всех языков программирования система структурной обработки исключений (SEH), поэтому самое сложное, что там нужно делать — это брандмауэр исключений. Например, в ActiveX объектах такое есть. Исключение ловится, конвертируется в информацию IErrorInfo, передаётся в COM, а функция возвращает неуспешный HRESULT. Потом, по другую сторону можно обратно сконструировать исключение другого языка программирования.

Но нас интересуют операционные системы вроде Линукса и БиЭсДи, и там всё гораздо сложнее из-за того, что функционал структурной обработки исключений отдан на откуп компиляторам, а ядро вызывает сигналы. А компиляторы — кто в лес, кто по дрова. Они заточены под то, что вся программа написана на одном языке программирования, и код инициализации ставит обработчики сигналов для всей программы, и только так оно работает, а возможность комбинировать разные языки программирования не учтена.

А Twitter–mode, я так посмотрю, в GNAT GPL 2015 так и остался:
Default_Exception_Msg_Max_Length : constant := 200;

Ни на сколечко не больше, чем минимально требует стандарт

Похоже, 0xC0000417 — это всё–таки не DEP, а STATUS_INVALID_CRUNTIME_PARAMETER, вызываемое, если безопасным версиям MSVCRT передать неправильный аргумент. Теперь из–за этой проблемы перестал запускаться DropBox.

Предлагаю поделиться хорошими аналогичными руководствами для других OS. Например, Linux и GCC. А также Mac OS X и Objective-C 2.0, с момента появления изключений в языке.
Windows, x86: microsoft.com
Windows, x64: msdn.microsoft.com

На платформе Windows мне понятно, каким образом, когда управление переходит от Delphi к Ada и наоборот, разъименование нулевого указателя приведёт к такому изключению, которое будет понятно той части кода, в которой произошло изключение. Из того, что мне известно про Linux, рождается смутное представление, что надо в местах exception firewall делать манипуляции с сигналами. Само собой там ничего работать не будет, как надо.

Возможное применение: Я всё–таки разберусь с SOM, somFree и буду как–нибудь скрещивать somFree с Wine, чтобы сделать нативный аналог Java. Чтобы это хорошо работало, мне нужно кристально чистое понимание работы изключений на каждой OS, остальные моменты, как мне сейчас кажется, я и так понимаю.