error_print_trace Subroutine

private subroutine error_print_trace(self, unit)

Print error with cause chain and stack trace to specified unit If unit not specified, prints to stdout

Type Bound

error_t

Arguments

Type IntentOptional Attributes Name
class(error_t), intent(in) :: self
integer(kind=default_int), intent(in), optional :: unit

Calls

proc~~error_print_trace~~CallsGraph proc~error_print_trace error_t%error_print_trace proc~code_to_string code_to_string proc~error_print_trace->proc~code_to_string proc~error_has_error error_t%error_has_error proc~error_print_trace->proc~error_has_error

Called by

proc~~error_print_trace~~CalledByGraph proc~error_print_trace error_t%error_print_trace proc~error_fatal error_t%error_fatal proc~error_fatal->proc~error_print_trace

Variables

Type Visibility Attributes Name Initial
integer(kind=default_int), private :: i
integer(kind=default_int), private :: out_unit

Source Code

   subroutine error_print_trace(self, unit)
      !! Print error with cause chain and stack trace to specified unit
      !! If unit not specified, prints to stdout
      class(error_t), intent(in) :: self
      integer(default_int), intent(in), optional :: unit
      integer(default_int) :: out_unit, i

      out_unit = stdout
      if (present(unit)) out_unit = unit

      if (.not. self%has_error()) return

      ! Top-level error with named code
      write (out_unit, '(A)', advance='no') code_to_string(self%code)//": "
      if (allocated(self%message)) then
         write (out_unit, '(A)') trim(self%message)
      else
         write (out_unit, '(A)') "(no message)"
      end if

      ! Cause chain
      do i = self%cause_depth, 1, -1
         write (out_unit, '(A)', advance='no') "  Caused by: "//trim(code_to_string(self%cause_codes(i)))//": "
         write (out_unit, '(A)') trim(self%cause_messages(i))
      end do

      ! Stack trace
      if (self%stack_depth > 0) then
         write (out_unit, '(A)') "Call stack (most recent first):"
         do i = self%stack_depth, 1, -1
            write (out_unit, '(A,I0,A)', advance='no') "  [", i, "] "
            write (out_unit, '(A)') trim(self%call_stack(i))
         end do
      end if
   end subroutine error_print_trace