On Tue, Mar 1, 2022 at 2:23 PM Steven D'Aprano <steve@pearwood.info> wrote:
    try:
        do_this()
        if condition: raise MyBreak
        do_that()
        if condition: raise MyBreak
        do_next_step()
        if condition: raise MyBreak
        do_last_step()
    except MyBreak:
        pass

Why not:

    while True:
        [loop body with ordinary breaks]
        break

It's less to write and almost free of charge*, and it also supports redo (continue).

MyBreak has the advantage that you can raise it in nested loops and subfunctions, although that could be a disadvantage since it makes the control flow confusing.

This goes for repeat-until also: I always write it while True: ... if cond: break. I just grepped through some personal Python projects and about 40% of my while-loop conditions are True.

* The break at the end is free, but Python 3.10.2 inserts a NOP at the location of the while True, and the peephole optimizers of earlier Python versions have done other things. It looks like there's been a lot of work on bytecode efficiency in 3.11, so maybe it will become truly free, but I haven't checked.

3.11 has range-based exception handling (issue 40222), so the try: approach is free if you don't raise MyBreak (but expensive if you do).