Ловля исключений нарушения прав доступа?

Правильный и безопасный метод для закрытия ресурсов, связанных с JDBC, это (взято из Как правильно закрыть ресурсы JDBC - Every Time ):

Connection connection = dataSource.getConnection();
try {
    Statement statement = connection.createStatement();

    try {
        ResultSet resultSet = statement.executeQuery("some query");

        try {
            // Do stuff with the result set.
        } finally {
            resultSet.close();
        }
    } finally {
        statement.close();
    }
} finally {
    connection.close();
}

80
задан Ahmed Said 19 January 2009 в 13:27
поделиться

6 ответов

Нет. C++ не выдает исключение, когда Вы делаете что-то плохо, которое подверглось бы хиту производительности. Вещи как нарушения прав доступа или ошибки деления на нуль больше похожи на исключения "машины", а не вещи уровня языка, которые можно поймать.

37
ответ дан unwind 5 November 2019 в 17:31
поделиться

Как указано, существует не не Microsoft / поставщик компилятора способ сделать это на платформе окон. Однако очевидно полезно поймать эти типы исключений в нормальной попытке {} выгода (исключение исключая) {} путь к сообщению об ошибке и больше корректному выходу Вашего приложения (как JaredPar заявляет, приложение теперь, вероятно, в беде). Мы используем _se_translator_function в простой обертке класса, которая позволяет нам ловить следующие исключения в обработчик попыток:

DECLARE_EXCEPTION_CLASS(datatype_misalignment)
DECLARE_EXCEPTION_CLASS(breakpoint)
DECLARE_EXCEPTION_CLASS(single_step)
DECLARE_EXCEPTION_CLASS(array_bounds_exceeded)
DECLARE_EXCEPTION_CLASS(flt_denormal_operand)
DECLARE_EXCEPTION_CLASS(flt_divide_by_zero)
DECLARE_EXCEPTION_CLASS(flt_inexact_result)
DECLARE_EXCEPTION_CLASS(flt_invalid_operation)
DECLARE_EXCEPTION_CLASS(flt_overflow)
DECLARE_EXCEPTION_CLASS(flt_stack_check)
DECLARE_EXCEPTION_CLASS(flt_underflow)
DECLARE_EXCEPTION_CLASS(int_divide_by_zero)
DECLARE_EXCEPTION_CLASS(int_overflow)
DECLARE_EXCEPTION_CLASS(priv_instruction)
DECLARE_EXCEPTION_CLASS(in_page_error)
DECLARE_EXCEPTION_CLASS(illegal_instruction)
DECLARE_EXCEPTION_CLASS(noncontinuable_exception)
DECLARE_EXCEPTION_CLASS(stack_overflow)
DECLARE_EXCEPTION_CLASS(invalid_disposition)
DECLARE_EXCEPTION_CLASS(guard_page)
DECLARE_EXCEPTION_CLASS(invalid_handle)
DECLARE_EXCEPTION_CLASS(microsoft_cpp)

исходный класс прибыл из этой очень полезной статьи:

http://www.codeproject.com/KB/cpp/exception.aspx

7
ответ дан Damien 5 November 2019 в 17:31
поделиться

Этот тип ситуации является зависящим от реализации, и следовательно это потребует поставщику определенного механизма для захвата. С Microsoft это включит SEH, и *отклоняют, включит сигнал

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

8
ответ дан JaredPar 5 November 2019 в 17:31
поделиться

Не механизм обработки исключений, Но можно использовать сигнал () механизм, который обеспечивается C.

> man signal

     11    SIGSEGV      create core image    segmentation violation

Запись в Нулевого указателя, вероятно, собирается вызвать сигнал

SIGSEGV
3
ответ дан Martin York 5 November 2019 в 17:31
поделиться

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

-1
ответ дан David Thornley 5 November 2019 в 17:31
поделиться

Прочтите и плачьте!

Я понял это. Если вы не выбросите из обработчика, обработчик просто продолжит работу, как и исключение.

Магия происходит, когда вы генерируете собственное исключение и обрабатываете его.

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>

void SignalHandler(int signal)
{
    printf("Signal %d",signal);
    throw "!Access Violation!";
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGSEGV , SignalHandler);
    try{
        *(int *) 0 = 0;// Baaaaaaad thing that should never be caught. You should write good code in the first place.
    }
    catch(char *e)
    {
        printf("Exception Caught: %s\n",e);
    }
    printf("Now we continue, unhindered, like the abomination never happened. (I am an EVIL genius)\n");
    printf("But please kids, DONT TRY THIS AT HOME ;)\n");

}
102
ответ дан 24 November 2019 в 09:47
поделиться
Другие вопросы по тегам:

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