![]()
|
|||||||
Теоретические сведения. Обработчик завершенияТеоретические сведения При разработке больших многомодульных программ зачастую окончательную их отладку и тестирование проводят позже, чтобы не отвлекаться от логики написания программы. Но подозрительные места (в которых могут возникнуть исключительные ситуации) оформляют соответствующим образом, с возможностью реакции на возникшее исключение. Участок программы, в котором предполагается возникновения исключения, называют защищаемым блоком, а участок, где записаны действия, выполняемые в случае исключения – обработчиком. К исключительным ситуациям относятся деление на 0 в арифметических выражениях, нарушение правил адресации, различные сбои и т.д. Операционная система Windows предоставляет службу Structured Exception Handling (SEH), которая позволяет реагироваь на исключительные ситауции. SEH предоставляет две возможности: - обработка завершений; - обработка исключений. Обработчик завершения В Microsoft Visual C++ данные блок оформляет так: __try{ //защищаемый блок } __finally { //обработчик завершений } Операционная система совместно с компилятором гаратирует, что код блока finally будет выполнене независимо от того, произойдет в защищенном блоке исключение или нет. Обработка проиисходит даже при наличие в защищаемом блоке операторов goto, return, break и тому подобных. Рассмотрим пример. DWORD Funcenstein1() { DWORD dwTemp; // действия __try{ //защищаемый блок //запрос разрешения на доступ к разделяемым данным WaitForSingleObject(g_hSem, INFINITE); g_wProtectedData=5; dwTemp= g_wProtectedData; return dwTemp; } __finally { //обработчик завершений ReleaseSemaphore(g_hSem,1,NULL); } dwTemp=9; retuen dwTemp; }
В данном примере имеет место преждевременных выход из блока try (оператор return dwTemp;). Блок finally разблокирует семафор для других процессов и тем самым гаратнирует корректную работу семафора в межпроцессном взаимодействии независимо от того, как завершится защищаемый блок.
|
|||||||
|