Error handler to capture Lua errors.
This routine encapsulates the retrieval of error messages from the Lua stack upon a failing Lua operation. It should be be used after all flu functions that return an err argument as result. Examples are fluL_loadfile and flu_pcall. The ErrString and ErrCode parameters are both optional. If none of them are provided, the execution will be stopped if an error had occured and err is not 0. The error message will be written to standard output in this case.
If either of them is provided, the application will continue and the calling side has to deal with the occured error.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(flu_State) | :: | L | Handle to the Lua script |
|||
integer, | intent(in) | :: | err | Lua error code to evaluate |
||
character(len=*), | intent(in) | :: | msg | Some additional message that should be prepended to the Lua error message if the program is stopped by the handler (no ErrString or ErrCode provided). |
||
character(len=*), | intent(out), | optional | :: | ErrString | Resulting error string obtained by combining msg and the error description on the Lua stack. |
|
integer, | intent(out), | optional | :: | ErrCode | The Lua error code, just the same as err. |
subroutine aot_err_handler(L, err, msg, ErrString, ErrCode)
type(flu_State) :: L !! Handle to the Lua script
!> Lua error code to evaluate
integer, intent(in) :: err
!> Some additional message that should be prepended to the Lua error
!! message if the program is stopped by the handler (no ErrString or ErrCode
!! provided).
character(len=*), intent(in) :: msg
!> Resulting error string obtained by combining msg and the error
!! description on the Lua stack.
character(len=*), intent(out), optional :: ErrString
!> The Lua error code, just the same as err.
integer, intent(out), optional :: ErrCode
logical :: stop_on_error
character, pointer, dimension(:) :: string
integer :: str_len
integer :: i
stop_on_error = .not.(present(ErrString) .or. present(ErrCode))
if (present(ErrCode)) then
ErrCode = err
end if
if (present(ErrString)) then
ErrString = ''
end if
if (err .ne. 0) then
string => flu_tolstring(L, -1, str_len)
if (present(ErrString)) then
do i=1,min(str_len, len(ErrString))
ErrString(i:i) = string(i)
end do
end if
if (stop_on_error) then
write(*,*) msg, string
STOP
end if
end if
end subroutine aot_err_handler