This is definitely not the best practice. One of the most important transformation of programming through the years is that: small tricks are no longer encouraged. Even the good tricks are not encouraged, because we want the programs to be easily understandable, not to say those ones that can cause various troubles.
The problem in this case is not really about whether the pogram is re-runnable, but about the fact that it corrupts your data. To make it more clear, let's talk more about re-runability
- The best type of programs can be rerun from the breaking point without any extra manual action, or the minimum of manual action, such as to remove or fix the data that broke the program. Once you fix the bad data, you can rerun the program, and it will pick up from where it failed. None of the data that has been processed will be reprocessed, unless it is logically required so.
- The okay type is that, the program does not know how to pick up from the broken point, so that you have to take manual actions to not only fix/remove the bad data, but also reverse what had been processed before it broke (much more manual actions than the first type). After all those manual execises, you can run the program again, but most likely it will start from the very beginning of the process, not the break point. If this program is time-consuming, you waste lots of time. This kind of program is called "not re-runnable".
- The worst type is what we have seen in this case, the problem is much more than whether it is re-runnable - it corrupts your data.