Question: Unlike C, Fortran does not need a break in each case. But is there a way to jump out of the select case statement besides `goto`? (I'd rather choose another way to jump if possible and I cannot use exit in select case statement.)

```
select case(key)
case("cat")
    if(value > 5) !break!
case("dog")
...
endselect

```

Here is an more detailed example. Though there are other types of flow control, break will be the best in my opinion

```
integer, allocatable :: Err(:)
select case(key)
case("cat")
    if(value1 > 5) call PushBack(Err, 1001)
    if(NotANumber(value2)) call PushBack(Err, 1002)
    if(value3 /= "good") call PushBack(Err, 1003)
    if(allocated(Err)) !break!
    .... !some processing
case("dog")
    ....
endselect
if(allocated(Err)) call ShowError(key, Err)

```

If I put everything in if:

```
integer, allocatable :: Err(:)
select case(key)
case("cat")
    if(value1 > 5) then            !Here only one of the value1, value2... is checked
        call PushBack(Err, 1001)
    elseif(NotANumber(value2)) then
        call PushBack(Err, 1002)
    elseif(value3 /= "good") then
        call PushBack(Err, 1003)
    else
        .... !some processing
case("dog")
    ....
endselect
if(allocated(Err)) call ShowError(key, Err)

```

If there are better solutions, please let me know.

Answer: 
Extended comment rather than answer ...

I don't understand what the problem is that @Francescalus has solved for you. Only one of the `case`s will be executed, the break to the end of the `select case` construct is the way that Fortran behaves. In your fragment:

```
select case(key)
case("cat")
    if(value > 5) !break!
case("dog")
...
endselect

```

only the line `if(value > 5) !break!` is executed if `cat` is selected. If your fragment ought to have been

```
select case(key)
case("cat")
    if(value > 5) then
        break
    else
        long and tedious processing
    end if
case("dog")
...
endselect

```

well that's just a long-winded way of writing

```
select case(key)
case("cat")
    if(value <= 5) then
        long and tedious processing
    end if
case("dog")
...
endselect

```

The `break` statement (or some syntactic equivalent) is needed in C and its ilk because the default behaviour is to fall through at the end of each `case`.

It seems to me @Francescalus's `massive_hack` is an absolutely appropriate use of `exit` in Fortran 2008, enabling an exit from an enclosing `do` construct to terminate a computationally-heavy loop over a sequence of elements.

I expect I've missed the point entirely ....
I agree with high-performance-mark that the constructed need for such a break (or exit) inside switch-case is flawed here. Not only in this switch-case-construct, but for all, one can always skip to the end by simply not executing the rest of that particular case. This is best achieved with one if-condition and putting the "additional processing" code into that if-block.

Of course, doing that multiple times increases your indentation level. But as usual, if that happens, you probably better move some of your complexity into a subroutine or function.

Therefore, neither EXIT nor GOTO is a good answer, here.