error stop
| Stop with message | |
| Exit codes | |
| Assert subroutine | |
| Guard clauses |
Stop with message
Error stop ends the program and prints your message to the error unit. Use it for faults the program cannot fix, such as bad input sizes. The message should say what was wrong and which value was seen.
program stop_demo
implicit none
integer :: n = -1
if (n <= 0) error stop "n must be positive"
print *, n
end program stop_demo
Exit codes
An integer code lets scripts tell failures apart. Zero means success, so nonzero codes mark each error path. Pick one code per failure and write the mapping in a comment.
program code_demo
implicit none
integer :: ios, n
! 2 means bad input
read(*, *, iostat=ios) n
if (ios /= 0) error stop 2
print *, n
end program code_demo
Assert subroutine
A tiny assert subroutine turns every assumption into one line. Call it with a condition and a message after each risky step. Failed checks stop at once with the message attached.
subroutine assert(ok, msg)
implicit none
logical, intent(in) :: ok
character(len=*), intent(in) :: msg
if (.not. ok) error stop msg
end subroutine assert
Guard clauses
Guard clauses test arguments at the top of a procedure and stop bad calls early. The main logic below then stays flat and readable. Each guard names the routine so the message points at the culprit.
subroutine set_n(n)
implicit none
integer, intent(in) :: n
if (n <= 0) error stop "set_n: n must be positive"
print *, n
end subroutine set_n
Next: Testing
Article author: Arthur Isaev