Сейчас на форуме: zds (+5 невидимых) |
eXeL@B —› Программирование —› try/ catch Access violation |
Посл.ответ | Сообщение |
|
Создано: 20 января 2014 23:29 · Личное сообщение · #1 |
|
Создано: 20 января 2014 23:35 · Поправил: reversecode · Личное сообщение · #2 |
|
Создано: 21 января 2014 00:19 · Личное сообщение · #3 |
|
Создано: 21 января 2014 00:22 · Личное сообщение · #4 исключение и не должно срабатывать а для ловли того что вы хотите вам нужны другие виндовые ловли исключений __try __finally | Сообщение посчитали полезным: KingSise |
|
Создано: 21 января 2014 01:25 · Личное сообщение · #5 |
|
Создано: 21 января 2014 16:46 · Личное сообщение · #6 int Ловят-ловят. Только для этого в проекте надо ключ выставить (для студии) /EHa. И ловиться будут всякие иксепшены, даже если они и не были через throw выброшены, правда, для этого надо использовать конструкцию catch(...). reversecode пишет: а для ловли того что вы хотите вам нужны другие виндовые ловли исключений __try __finally Подойдёт и _try ... __except. Но некрасиво. И, как бы, И никто не читает мой блог (пичаль). ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 21 января 2014 16:55 · Поправил: reversecode · Личное сообщение · #7 |
|
Создано: 21 января 2014 17:30 · Личное сообщение · #8 ARCHANGEL Да я уже и не помню всех этих тонкостей. Кроме того, как уже правильно написал reversecode есть стандарт. И есть компании, работая в которых вы будете получать пизд**ей за нарушения стандартов. Хороший код работает везде где угодно, собирается любым компилятором и работает стабильно (кроме system specific задач). Я уже три года пишу софт в основном только под линукс и исключений у меня там не возникает. Писать надо уметь без исключений. Линукс очень хорошо воспитывает это (just google for segmentation fault). И не надо писать тут, что код получается не красивым. Пара проверок всяко красивее, чем переключения ring3 -> ring0 -> ring3 с вызовом десятков процедур для обработки исключений. И да, прочитал ваш блог, вам F_a_u_s_t уже все объяснил. | Сообщение посчитали полезным: dosprog |
|
Создано: 21 января 2014 18:16 · Поправил: dosprog · Личное сообщение · #9 KingSise, глюк при компиляции?... Чтобы понять, в чём дело, я бы добавил (временно) проверку вроде такой: if( &mFileNames0<400000) {/*Тут вывод сообщения, что какая-то лажа*/....;} ...нужно пробовать. --ADD-- Archer, 1) согласен, верно будет 10000. 2) обычный if - так проще всего. Тем более, что потом это всё равно нужно удалить. |
|
Создано: 21 января 2014 18:28 · Личное сообщение · #10 dosprog Не совсем понятно, откуда взялось 400000, коль это динамически выделяемая память, уж тогда брать нижнюю невыделяемую границу в 0x10000. А во-вторых, для этого assert есть. KingSise А тут мне непонятно, откуда обращение к члену даёт ошибку чтения по адрессу 0х00000080. Сдаётся мне, это обращение в несуществующий экземпляр класса. И надо бы проверку делать где-то раньше, либо вообще такую бяку не писать, походу, проектирование хромает. |
|
Создано: 21 января 2014 18:35 · Личное сообщение · #11 Archer пишет: Сдаётся мне, это обращение в несуществующий экземпляр класса. Я бы сказал код вырван из контекста. Можно делать очень много предположений на тему того, откуда ноги растут. И не факт, что именно mFileNames0 вызывает исключение, это лишь предположение автора, который явно не до конца понимает суть проблемы исключений. Я вот например не понимаю, откуда там вообще может быть исключение, если это обычный указатель, который проверяется на ноль - все вполне законно. Ошибка может быть где-то выше. |
|
Создано: 21 января 2014 18:42 · Поправил: dosprog · Личное сообщение · #12 int, это испорченный, неверный указатель (сама переменная). Даже не "указатель в никуда". Ошибка компилятора или ошибка программиста. Archer верно описал возможную причину. Например, в самом простом случае, всё выглядит промерно так: char* pStr = "Hello"; Тогда: &pStr == 0x490000 (например) - зависит от компиляции (!) - Переменная времени компиляции - Дальше константа времени выполнения - Указатель на указатель на строку "Hello" pStr == 0x650000 (например) - зависит от компиляции - Переменная - Указатель на строку "Hello" *pStr == "Hello" (точно!) В примере глюка у KingSize &pStr==0x80. Естественно, обычной программе оттуда читать ничего нельзя. P.S. Это всё в Си-шной терминологии. Не вдаваясь в ++. --ADD-- К следующему посту, int, да. Я малость всё усложнил. |
|
Создано: 21 января 2014 19:42 · Личное сообщение · #13 dosprog пишет: &pStr==0x80 А где вы видите там амперсенд? reversecode специально переспросил про форму записи обращения к переменной. Указателю я могу присвоить что угодно и все хорошо, пока я не обратился по указателю. Ссылаться я могу хоть "в космос", фолт возникает, когда выполняется что-то вроде mov ebx, [edi], где edi равен 0x80. Но я слабо представляю, как может возникнуть фолт на инструкции mov ebx, edi или lea ebx,[edi]. |
|
Создано: 21 января 2014 20:43 · Личное сообщение · #14 ARCHANGEL пишет: reversecode пишет:а для ловли того что вы хотите вам нужны другие виндовые ловли исключений__try__finally вот ответ на мой вопрос ;) Все получилось и работает отлично. сделал так и все работает: Code:
----- -=истина где-то рядом=- |
|
Создано: 21 января 2014 20:49 · Поправил: dosprog · Личное сообщение · #15 |
|
Создано: 21 января 2014 21:31 · Личное сообщение · #16 KingSise пишет: Все получилось и работает отлично. Скверное решение, где можно обойтись без капитуляции ( сепшенов ) там нужно обходится без нее. Причины до тупого просты, с условиями код нагляднее, код должен контролироваться там, где это возможно и так же, должен быть предсказуем, а значит, он должен решаться условиями. Сепшены нужны в редких случаях, когда контролировать результат затруднительно или вообще невозможно, все остальное, это ошибки проектирования. Дело в том, когда проект изначально маленький, то код зачастую пишется небрежно, но по истечению времени, он начинает разрастаться, а старые костыли, как правило никто не убирает и в итоге каша вместо кода. Это не говоря о том, что исключение может вызываться в одном месте, а обрабатываться в другом и мягко говоря, можно устать от беготни по обработчикам. За __try.. уже говорил, для большинства задач достаточно стандартных try.. Итог, лучше заняться редизайном, а не подпирать костыли костылями, дальше будет больше и когда то это все рухнет. |
|
Создано: 22 января 2014 13:28 · Поправил: reversecode · Личное сообщение · #17 |
|
Создано: 22 января 2014 23:28 · Поправил: Dr0p · Личное сообщение · #18 |
|
Создано: 23 января 2014 00:08 · Поправил: ARCHANGEL · Личное сообщение · #19 int пишет: Я уже три года пишу софт в основном только под линукс и исключений у меня там не возникает. Писать надо уметь без исключений. Линукс очень хорошо воспитывает это (just google for segmentation fault). И не надо писать тут, что код получается не красивым. Пара проверок всяко красивее, чем переключения ring3 -> ring0 -> ring3 с вызовом десятков процедур для обработки исключений. Не, ну это ещё можно как-то понять, линукс, может, и воспитывает это - я не пробовал, не могу судить. Но смысл в исключениях есть. А вот это уже не лезет ни в какие ворота: Dr0p пишет: Эта хуита вообще не понятно зачем придумана. Книга с.132-133. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 23 января 2014 00:18 · Поправил: reversecode · Личное сообщение · #20 |
|
Создано: 24 января 2014 11:55 · Личное сообщение · #21 |
|
Создано: 24 января 2014 20:20 · Личное сообщение · #22 |
|
Создано: 24 января 2014 22:38 · Поправил: neomant · Личное сообщение · #23 KingSise пишет: Так и есть, не проверил создан ли класс. Как оказалось при некоторых условиях он не создается и проверка нужна. На этот случай в конструкторе при невозможности создания объекта бросается исключение. Далее по стандартной схеме try/catch/finally, но уже без обращения по нулевым указателям. ----- Следуй за белым кроликом |
eXeL@B —› Программирование —› try/ catch Access violation |