Можно ли использовать механизм try ... catch, чтобы избежать сбоев памяти? - PullRequest
1 голос
/ 10 сентября 2010

Мне действительно интересно знать, возможно ли использование механизма try ... catch, чтобы избежать сбоя памяти в нашем приложении ... ??

Допустим, часть программы, в которой мы ожидаем вероятность утечки памяти, находится в блоке try ... catch, если происходит сбой программы (т. Е. Утечка памяти), выполняется оператор catch.Таким образом, мы можем предотвратить сбой нашей программы.

Возможно ли это?Если да, то как или если нет, то почему нет?

Ответы [ 3 ]

4 голосов
/ 10 сентября 2010

Блок try / catch существует для того, чтобы перехватить исключение и остановить его распространение в вашем стеке вызовов.

Идея состоит в том, что вы ловите его там, где знаете, как его обработать, а затему вас есть шанс выполнить код в ответ на исключение.

Это не волшебное решение, которое предотвратит что-либо, это просто то, что я сказал выше.То, что вы делаете с исключением, это то, что имеет значение.

И утечка памяти, и сбой - это не одно и то же, редко происходит сбой программы из-за утечек памяти, если только в ней фактически не заканчивается память.Утечка памяти редко "исправима" после свершившегося факта.Правильный и, как правило, единственный способ исправить утечку памяти - это избежать ее возникновения.

Кроме того, да, таким образом вы можете предотвратить сбой вашей программы, добавив блоки try / catch для всехбольше, но единственное, что вам удалось - это скрыть сбой от пользователя, а затем позволить программе продолжить работу.«Сбои» не всегда безопасно игнорировать, или, скорее, их не всегда безопасно игнорировать.

Если вы ищете какой-нибудь всеобъемлющий совет о том, как избежать сбоя программы, вот мой совет:

  • Напишите программу, которая работает правильно

Я думаю, нам нужно больше узнать о том, какие у вас проблемы, или вам нужноопубликовать более понятный вопрос.

0 голосов
/ 10 сентября 2010

Если вы спрашиваете «могу ли я поймать ошибки сегментации с помощью try catch», ответ - нет.

try catch предназначен для обработки исключений Objective-C, то есть тех, которые возникают при выполнении оператора @throw.Ошибки сегментации, вызванные, например, разыменованием нулевого указателя, генерируются операционной системой и являются примерами сигналов Unix и могут быть перехвачены и обработаны только системными вызовами уровня ОС, например, системным вызовом sigaction (2).Даже тогда единственная разумная вещь, которую вы можете сделать, это немедленно завершить программу, потому что у вас может быть поврежденная куча или стек.

0 голосов
/ 10 сентября 2010

Я бы не стал доверять какой-либо внутрипроцессной системе, чтобы она поступала правильно в случае нехватки памяти. У нас есть системы, которые полностью блокируются при возникновении исключения PermGen, и нам нужно убить -9, чтобы избавиться от них.

Если вы хотите, чтобы система самостоятельно исправлялась, оберните ее в сценарий или систему, которая отслеживает состояние здоровья, сердцебиение или страницу диагностики, или что-либо еще, что имеет смысл. Если вы не получили индикацию здоровья, убейте ее (если нужно, тяжело) и перезапустите.

Лучше всего использовать тестирование и валидацию, чтобы включить мониторинг использования памяти (и диска) и убедиться, что вы действительно знаете, как ваша система работает и правильно настроена, чтобы этого не происходило.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...