When you verbally say "IF current goes over X, THEN turn off the output", you are implicitly forgetting a lot of obvious things:
1. What happens to current when it turns off? Goes to zero. So do we keep evaluating this, and it oscillates at some unimaginable frequency?
2. Should it actually store the state instead? (IF current goes over X, THEN turn the output off, and keep it off until Y.) And does that account for the race condition ("IF Y THEN turn the output on" is fine, but what about IF X AND Y)?
3. Or did you actually mean to control this continuously? One of the most common misunderstandings people use is to attempt to express continuous functions (Y varies with X) in discrete terms (if X then Y). Even when they know and understand that a system is continuous.
4. And not just continuous voltage / current, but what about continuous time? Suppose we evaluate this statement periodically: "SET op-amp output = (Vin - Vout) * 1000, limited to +V/0V" Each sample, the output toggles, because with so much gain, we've just implemented an equivalent process to (1)! The difference being, now the frequency is known.
It's clear to see that, even in this simple case, something is missing. Much more gain would be desirable to achieve a precise current limit: but such excessive gain is clearly impossible to use. Well, suppose we add an integral term: "SET op-amp output equal to its previous value plus the error, limited to +V/0V". Now the output can change only slowly from sample to sample, yet the amount of gain it has will eventually go to infinity (add up 0.0001 or smaller error, enough times, and you'll always swing from 0V to +V).
This is the basic integrator (the I in "PID") controller.
The output of an integrating feedback loop still need not be stable, because if the load itself takes some time to respond, it's doubled up through the feedback loop, and you can get ringing at a minimum (namely, that the output alternates or 'hunts' to find the correct value, eventually settling down), or full blown oscillation. By modifying the output expression (Vo = Vo(prev) + ki * error + kp * (error - error(prev)) + ...), so that it's calculated not just from the present inputs, but takes history into account, you get the basic PID controller.
Now we've finally got something theoretically interesting: it's rich enough to be useful -- we've got continuous numbers, not boolean states; time is accounted for, and we even have some means to implement stability. It's still discrete-time, but this restriction can now be lifted fairly easily, by translating the abstract loop into electronic building blocks. At last, it is a continuous-value, continuous-time system, and we have a model that's realistic.
Now, going back to your circuit, that obviously means:
1. You don't want a switched output, you need an amplifier. So, op-amp instead of comparator, and instead of some transistors slapped together, something that's actually linear to help the op-amp do its job. (Or a beefy enough op-amp could handle the load all its own. Whichever works best.)
2. That amplifier takes some time to respond*, so we will need to compensate its gain with some approximation of a PID loop, say.
*And this is still a turn of phrase which is physically inconsistent. It's not as gross an error, because it's much more quantitative: an ideal pole (like a single RC lowpass filter) does implement a time delay under suitable definitions (most often, the 50% rise time point, for a step input). But it's not an ideal delay, like a transmission line is. A pole is a frequency cutoff, not a time cutoff. And by "cut", we don't mean it drops suddenly, either (again, using clunky boolean words to relate to something continuous), it falls quite gradually.
Tim