Правильный и безопасный метод для закрытия ресурсов, связанных с 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();
}
Нет. C++ не выдает исключение, когда Вы делаете что-то плохо, которое подверглось бы хиту производительности. Вещи как нарушения прав доступа или ошибки деления на нуль больше похожи на исключения "машины", а не вещи уровня языка, которые можно поймать.
Как указано, существует не не 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)
исходный класс прибыл из этой очень полезной статьи:
Этот тип ситуации является зависящим от реализации, и следовательно это потребует поставщику определенного механизма для захвата. С Microsoft это включит SEH, и *отклоняют, включит сигнал
В целом, хотя ловля исключения Нарушения прав доступа очень плохая идея. Нет почти никакого способа восстановиться с исключения AV, и пытающийся сделать так просто приведет к тяжелее для нахождения ошибок в программе.
Не механизм обработки исключений, Но можно использовать сигнал () механизм, который обеспечивается C.
> man signal
11 SIGSEGV create core image segmentation violation
Запись в Нулевого указателя, вероятно, собирается вызвать сигнал
SIGSEGVНарушение как это средство, что существует что-то серьезно неправильно с кодом, и это ненадежно. Я вижу, что программа могла бы хотеть попытаться сохранить данные пользователя способом, что каждый надеется, не перепишет предыдущие данные, в надежде, что данные пользователя уже не повреждаются, но нет по определению никакого стандартного метода контакта с неопределенным поведением.
Прочтите и плачьте!
Я понял это. Если вы не выбросите из обработчика, обработчик просто продолжит работу, как и исключение.
Магия происходит, когда вы генерируете собственное исключение и обрабатываете его.
#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");
}