Python has the "with" context manager that creates "objects" and automatically "handles" them when the context is left for any reason, including crashes, which is very handy for error handling. I use it most often when dealing with files to dump some simple text, but it's much more flexible than that.
It put me on the track of thinking about languages and programming as "sets of assumptions". There is the EBNF ('extended backus naur form') that sort of recursively defines what things mean in the language, but I found that a bit hard to read and it's not clear about some other things, like execution order. It still assumes we read things left to right execute statements one by one, etc..
Anyway, I thought it would be really neat as a mental model if we could do something like this:
with [C assumptions]: [C code]
with [python assumptions]: [python code]
with [sequential and precise]: something
with [I'm describing a general process, but please optimize yourself]: something elseThat's a bit rudimentary, I'm sure there are better ways to describe, write and order assumptions or to define how "a" interpreter handles them.