简体   繁体   中英

Can the try…catch mechanism be used to avoid memory crashes?

I am really interested to know that, Is it possible that using try ... catch mechanism, we can avoid memory crash of our application ... ??

Let say the program part that we are expecting a chance of memory leak is kept under try...catch block, if the program crashes (ie memory leak) occurs then catch statement execute. So we can prevent our program from being crashed.

Is it possible ? If yes, How Or If not , why not ??

A try/catch block is there to catch an exception and stop it from propagating upwards in your callstack.

The idea goes that you catch it at the place where you know how to handle it, and then you get a chance to execute code in response to the exception.

It is not a magical solution that will prevent anything, it is just what I said above. What you do with the exception is what matters.

And a memory leak and a crash is not the same thing, it is rare that a program crashes due to memory leaks, unless it actually runs out of memory. A memory leak is rarely "fixable" after the fact. The correct, and usually only, way to fix a memory leak is to avoid it happening in the first place.

Also, yes, in a way you can keep your program from crashing by adding try/catch blocks all over, but the only thing you've succeeded in is to hide the crash from the user, and then let the program continue running. "Crashes" are not always safe to ignore, or rather, they are usually not safe to ignore.

If you are looking for some catch-all advice on how to avoid a program crashing, here's my advice:

  • Write a program that works correctly

I think we need to know more about what kinds of problems you're having, or you need to post a clearer question.

I would not trust any in process system to do the right thing in case of an out of memory condition. We have systems which completely lock up when a PermGen exception occurs and need a kill -9 to get rid off.

If you want the system to self correct, wrap it in a script or a system which monitors the health, a heart beat or a diagnostics page or whatever makes sense. If you receive no health indication kill it (hard if necessary) and restart it.

Best of all is to use testing and validation to include monitoring the memory (and disk) usage and make sure you really know how your system behaves and is properly configured so it does not happen.

The restarting solution is a poor alternative, because you then must test and ascertain that you can kill your application at any time and be confident it can be restarted correctly, which might even be more difficult.

If you are asking "can I catch segmentation faults with try catch", the answer is no.

try catch is for handling Objective-C exceptions ie those raised by executing an @throw statement. Segmentation faults caused by eg null pointer dereferences are generated by the operating system and are examples of Unix signals and can only be caught and handled by OS level system calls eg the sigaction(2) system call. Even then, the only sane thing you can do is terminate the program immediately because you might have a corrupt heap or stack.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM