|
Как завершить выполнение процедуры (метода объекта) из вложенной в неё процедуры (метода)
|
|||
---|---|---|---|
#18+
Приветствую Уважаемый All! Пишу в VBA пользовательский класс, и вот такой вопрос возник. У класса есть такие методы: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
т.е. вызов метода A объекта, приводит к вызову метода D "хрен-знает-какой" вложенности - A->B->C->D. Дальше, в методе D, я определяю, что данные некорректны, и дальнейшее выполнение не имеет смысла . И теперь вопрос: можно ли как-то, в методе D, "погасить" весь процесс (всю "цепочку" вызова A->B->C->D), БЕЗ ВОЗВРАТА в те процедуры-методы, из которых он вызван? Или, например, по какому-то условию в D, процесс перешёл в метод KillMe (где я обнулю всё что нужно и "скажу" пользователю, всё что о нём думаю), и уже "назад не вернулся"? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2015, 18:35 |
|
Как завершить выполнение процедуры (метода объекта) из вложенной в неё процедуры (метода)
|
|||
---|---|---|---|
#18+
Создайте в А обработчик ошибки (On Error Goto ...), а во вложенных не создавайте. При обнаружении в любой вложенной ошибки делайте Err.Raise ..., управление будет передано в ближайший обработчик ошибки, т.е. в обработчик ошибки в А. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2015, 19:03 |
|
Как завершить выполнение процедуры (метода объекта) из вложенной в неё процедуры (метода)
|
|||
---|---|---|---|
#18+
+ Всё же можно создать обработчики во "вложенных" методах, но создавайте свою ошибку, и пробрасывайте её дальше. Какие сможете ошибки - обработаете, остальные - пробрасывайте через Err.Raise наружу, пока не дойдёте до того метода, который её обработает ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2015, 20:28 |
|
Как завершить выполнение процедуры (метода объекта) из вложенной в неё процедуры (метода)
|
|||
---|---|---|---|
#18+
VSVLAD+ Всё же можно создать обработчики во "вложенных" методах, но создавайте свою ошибку, и пробрасывайте её дальше. Какие сможете ошибки - обработаете, остальные - пробрасывайте через Err.Raise наружу, пока не дойдёте до того метода, который её обработаетДа, спасибо! В итоге, после совета от Казанский тоже к этому пришёл - генерировать "свою" ошибку и "транслировать" её "на верх" :) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69.
Не так, конечно, "лаконично" как хотелось, но полюбому лучше, чем вводить статус завершения процедуры и проверять его в вызвавшей процедуре. Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2015, 20:41 |
|
Как завершить выполнение процедуры (метода объекта) из вложенной в неё процедуры (метода)
|
|||
---|---|---|---|
#18+
ълучше, чем вводить статус завершения процедуры и проверять его в вызвавшей процедуре. Вот интересно, чем же это лучше? тем, что появляется потенция к double fault error? что нарушается нормальная трасса выполнения? что нет возможности определить точку возникновения проблемы? что процедуры фактически становятся не-повторноиспользуемыми? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 11:19 |
|
Как завершить выполнение процедуры (метода объекта) из вложенной в неё процедуры (метода)
|
|||
---|---|---|---|
#18+
AkinaВот интересно, чем же это лучше? тем, что появляется потенция к double fault error? Это я не знаю что такое, но педивикия говорит, что в "современном защищенном режиме операционной системы" такое получить - постараться нужно, типа использовать функции ядра ... у меня такого нет Akinaчто нарушается нормальная трасса выполнения? В том то и дело, что ХОТЕЛ, что бы "нарушалась", а в итоге - "не получил" :) Выполнение всё равно "возвращается", по всему "дереву" процесса к вызванному методу. Просто инициирует этот возврат, не десяток проверок возвр.статуса+Exit во всех вложенных методах, типа Код: vbnet 1. 2. 3. 4.
и так же для Function B, и во всех точках вызова D, C и B а одна "типовая" конструкция, которая описывается один раз и навсегда! Сколько бы после этого я не менял (добавлял или убирал вызовы из A->B, B->C, C->D), данная конкретная ошибка в данных - будет обрабатываться, без доп.проверок. Akinaчто нет возможности определить точку возникновения проблемы? С этим, как раз, всё в порядке во-первых так Код: vbnet 1.
а, во-вторых, можно и дальше создавать/генерировать другие пользовательские ошибки, со своим номером, под каждый "случай" Akinaчто процедуры фактически становятся не-повторноиспользуемыми?С этим, в общем согласен. Только у меня всё кроме A - приватные методы, и к ним доступа не будет. Так что тут всё "на совести разработчика" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 12:05 |
|
Как завершить выполнение процедуры (метода объекта) из вложенной в неё процедуры (метода)
|
|||
---|---|---|---|
#18+
Просто альтернатива - конвертация процедуры в функцию,- более проста и прозрачна. Возвращаемое значение = статус, который прямо на месте можно и анализировать: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Половина WinAPI так живёт... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 13:13 |
|
Как завершить выполнение процедуры (метода объекта) из вложенной в неё процедуры (метода)
|
|||
---|---|---|---|
#18+
ъVSVLAD+ Всё же можно создать обработчики во "вложенных" методах, но создавайте свою ошибку, и пробрасывайте её дальше. Какие сможете ошибки - обработаете, остальные - пробрасывайте через Err.Raise наружу, пока не дойдёте до того метода, который её обработаетДа, спасибо! В итоге, после совета от Казанский тоже к этому пришёл - генерировать "свою" ошибку и "транслировать" её "на верх" :) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69.
Не так, конечно, "лаконично" как хотелось, но полюбому лучше, чем вводить статус завершения процедуры и проверять его в вызвавшей процедуре. Всем спасибо!Генерация ошибок очень накладная операция. Если прерывание происходит достаточно часто, то этот способ заметно затормозит программу. Я бы сделал общий флажок и проверял его в начале каждого метода в цепочке. Это и выглядит короче: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 13:52 |
|
|
start [/forum/topic.php?fid=60&fpage=33&tid=2155993]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
93ms |
get tp. blocked users: |
2ms |
others: | 314ms |
total: | 489ms |
0 / 0 |