Информация об изменениях

Сообщение Re[13]: А чего молчим про Crowdstrike от 25.07.2024 22:37

Изменено 25.07.2024 22:43 vdimas

Re[13]: А чего молчим про Crowdstrike
Здравствуйте, Константин Б., Вы писали:

КБ>Ну т.е. программист должен будет написать вот такое в каждом месте где он разыменовывает указатель?


Макросы плюс библиотечная поддержка.

Ну и, для голого Си можно ограничится пробрасыванием int err_code:
throw_err(EINVAL);

Всё равно нет наследования объектов, поэтому пробрасывать некие объекты из иерархии их бессмысленно.
К тому же, нет конструктора копирования, поэтому выбрасывать исключения-структуры по-значению не выйдет.

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


3. Реальная сложность будет в разметке catch, процитирую себя:

ключевое отличие лишь в том, что setjmp вызывается коде динамически, т.е. некий твой код динамически заполняет структуру jmp_buf, а компилятор генерит таблицу уже заполненных аналогичных структур для ф-ии еще в процессе компиляции.

Т.е. компилятор нифига не помогает в случае Си.

Поэтому, сначала пришлось бы регистрировать обработчики, а потом выполнять целевой код, как-то так:
int do_something(void) {
    throw_err(42);
}

int some_fn() {
    int rc;

    try()
        catch_err(42) 
            printf("Error!!!\n");
        end_catch()

        catch_err(43) 
            printf("Warning!!!\n");
        end_catch()

        rc = do_something();
    end_try()

    return rc;
}
Re[13]: А чего молчим про Crowdstrike
Здравствуйте, Константин Б., Вы писали:

КБ>Ну т.е. программист должен будет написать вот такое в каждом месте где он разыменовывает указатель?


Макросы плюс библиотечная поддержка.

Ну и, для голого Си можно ограничится пробрасыванием int err_code:
throw_err(EINVAL);

Всё равно нет наследования объектов, поэтому пробрасывать некие объекты из иерархии их бессмысленно.
К тому же, нет конструктора копирования, поэтому выбрасывать исключения-структуры по-значению не выйдет.

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


3. Реальная сложность будет в разметке catch, процитирую себя:

ключевое отличие лишь в том, что setjmp вызывается коде динамически, т.е. некий твой код динамически заполняет структуру jmp_buf, а компилятор генерит таблицу уже заполненных аналогичных структур для ф-ии еще в процессе компиляции.

Т.е. компилятор нифига не помогает в случае Си.

Поэтому, сначала пришлось бы регистрировать обработчики, а потом выполнять целевой код, как-то так:
int do_something(void) {
    throw_err(42);
}

int some_fn() {
    int rc = -1;

    try()
        catch_err(42) 
            printf("Error!!!\n");
        end_catch()

        catch_err(43) 
            printf("Warning!!!\n");
        end_catch()

        rc = do_something();
    end_try()

    return rc;
}