diff --git a/examples/example_hl.f90 b/examples/example_hl.f90
index 3f347e3efbd5787b934ed024dfc6c5c758887316..62d46f0e2579d617fd8199c5072bb0900e668915 100644
--- a/examples/example_hl.f90
+++ b/examples/example_hl.f90
@@ -77,4 +77,7 @@ PROGRAM example
   dqts = td1%divideInSecondsBy(td)
   WRITE (0,*) td1%to_string(), " / ", td%to_string(), " = ", dqts%quotient, " plus stuff"
 
+  ! produce error
+  dt = t_datetime("1970--01-01T00:00:00")
+
 END PROGRAM example
diff --git a/src/libmtime.f90 b/src/libmtime.f90
index be34111f81f066ed25e27ef6025a47c6a492907e..c777d023ff794b65c6b9aec9d9d974004d52eeca 100644
--- a/src/libmtime.f90
+++ b/src/libmtime.f90
@@ -3473,7 +3473,12 @@ contains
   SUBROUTINE finish_mtime_plain(leading_text, message_text)
     character(len=*), intent(in) :: leading_text
     character(len=*), intent(in) :: message_text    
-    CALL finish_message(TRIM(leading_text), TRIM(message_text))
+    IF (ASSOCIATED(finish_message)) THEN
+      CALL finish_message(TRIM(leading_text), TRIM(message_text))
+    ELSE
+      WRITE (0,*) TRIM(leading_text), TRIM(message_text)
+      STOP
+    END IF
   END SUBROUTINE finish_mtime_plain
   !>
   !! @brief Print a datetime with associated text information by the provided callback function and finish program.
diff --git a/src/libmtime_hl.f90 b/src/libmtime_hl.f90
index 475ed9233558e02a641332e91bf32a1e9bd14766..6a0d466d26d9ea35d9a470ce7d41cebd3fd65c53 100644
--- a/src/libmtime_hl.f90
+++ b/src/libmtime_hl.f90
@@ -150,12 +150,14 @@ contains
 
   !___________________________________________________________________________
   ! auxiliary routine: handle error code.
-  SUBROUTINE handle_errno(errno, routine_str)
+  SUBROUTINE handle_errno(errno, routine_str, lineno)
     INTEGER, INTENT(IN) :: errno
+    INTEGER, INTENT(IN) :: lineno
     CHARACTER(LEN=*), INTENT(IN) :: routine_str
     CHARACTER(len=max_mtime_error_str_len)     :: error_str
     IF (errno /= no_error) THEN
       CALL mtime_strerror(errno, error_str)
+      WRITE (error_str,'(a,a,i0)') TRIM(error_str), " :: line ", lineno
       CALL finish_mtime(routine_str, error_str)
     END IF
   END SUBROUTINE handle_errno
@@ -172,7 +174,7 @@ contains
     type(datetime), pointer :: dt_tmp
     INTEGER :: errno
     dt_tmp => newdatetime(from%dt, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     to%dt = dt_tmp
     call deallocatedatetime(dt_tmp)
   end subroutine assign_t_datetime
@@ -184,7 +186,7 @@ contains
     type(datetime), pointer :: dt_tmp
     INTEGER :: errno
     dt_tmp => newdatetime(dt_string, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__,  __LINE__)
     t_datetime_assign_string%dt = dt_tmp
     call deallocatedatetime(dt_tmp)
   end function t_datetime_assign_string
@@ -205,9 +207,9 @@ contains
     type(datetime), pointer              :: dt_tmp
     integer                              :: errno
     dt_tmp => newdatetime(this%dt, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     CALL datetimetostring(dt_tmp, t_datetime_to_string, errno)    
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     CALL deallocatedatetime(dt_tmp)
   end function t_datetime_to_string
 
@@ -220,9 +222,9 @@ contains
     type(datetime), pointer              :: dt_tmp
     integer                              :: errno
     dt_tmp => newdatetime(this%dt, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     CALL datetimetoposixstring(dt_tmp, t_datetime_to_posix_string, format_string, errno)    
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     CALL deallocatedatetime(dt_tmp)
   end function t_datetime_to_posix_string
  
@@ -236,9 +238,9 @@ contains
     type(timedelta), pointer        :: td_tmp
     INTEGER                         :: errno
     dt_tmp => newDatetime(this%dt, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     td_tmp => newTimedelta(td%td, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     dt_tmp = dt_tmp + td_tmp
     dt_td_sum%dt = dt_tmp
     call deallocateDatetime(dt_tmp)
@@ -255,9 +257,9 @@ contains
     type(timedelta), pointer        :: td_tmp
     INTEGER                         :: errno
     dt_tmp => newDatetime(this%dt, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     td_tmp => newTimedelta(td%td, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     if (td_tmp%sign == "+") then
       td_tmp%sign = "-" 
     else
@@ -327,7 +329,7 @@ contains
     type(timedelta), pointer        :: td_tmp
     INTEGER                         :: errno
     td_tmp => newTimedelta(from%td, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     to%td = td_tmp
     to%td%sign = td_tmp%sign
     call deallocateTimedelta(td_tmp)
@@ -340,7 +342,7 @@ contains
     type(timedelta), pointer     :: td_tmp
     INTEGER                      :: errno
     td_tmp => newtimedelta(td_string, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     t_timedelta_assign_string%td = td_tmp
     t_timedelta_assign_string%td%sign = td_tmp%sign
     call deallocatetimedelta(td_tmp)
@@ -354,9 +356,9 @@ contains
     character(len=max_timedelta_str_len) :: td_string
     INTEGER                              :: errno
     CALL getptstringfromms(INT(td_ms,i8), td_string, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     td_tmp => newtimedelta(td_string, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     t_timedelta_assign_ms%td = td_tmp
     t_timedelta_assign_ms%td%sign = td_tmp%sign
     call deallocatetimedelta(td_tmp)
@@ -415,7 +417,7 @@ contains
     TYPE(timedelta), POINTER             :: td_tmp, td_tmp2
     INTEGER :: errno
     td_tmp => newtimedelta(this%td, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     td_tmp2           = td_tmp * lambda
     scaled_td%td      = td_tmp2
     scaled_td%td%sign = td_tmp2%sign
@@ -430,7 +432,7 @@ contains
     TYPE(timedelta), POINTER             :: td_tmp, td_tmp2
     INTEGER :: errno
     td_tmp => newtimedelta(this%td, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     td_tmp2           = td_tmp * lambda
     scaled_td%td      = td_tmp2
     scaled_td%td%sign = td_tmp2%sign
@@ -445,7 +447,7 @@ contains
     TYPE(timedelta), POINTER             :: td_tmp, td_tmp2
     INTEGER :: errno
     td_tmp => newtimedelta(this%td, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     td_tmp2           = td_tmp * lambda
     scaled_td%td      = td_tmp2
     scaled_td%td%sign = td_tmp2%sign
@@ -460,7 +462,7 @@ contains
     TYPE(timedelta), POINTER             :: td_tmp, td_tmp2
     INTEGER :: errno
     td_tmp => newtimedelta(this%td, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     td_tmp2           = td_tmp * lambda
     scaled_td%td      = td_tmp2
     scaled_td%td%sign = td_tmp2%sign
@@ -475,7 +477,7 @@ contains
     TYPE(timedelta), POINTER             :: td_tmp, td_tmp2
     INTEGER :: errno
     td_tmp => newtimedelta(this%td, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     td_tmp2           = td_tmp * lambda
     scaled_td%td      = td_tmp2
     scaled_td%td%sign = td_tmp2%sign
@@ -490,7 +492,7 @@ contains
     TYPE(timedelta), POINTER             :: td_tmp, td_tmp2
     INTEGER :: errno
     td_tmp => newtimedelta(this%td, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     td_tmp2           = td_tmp * lambda
     scaled_td%td      = td_tmp2
     scaled_td%td%sign = td_tmp2%sign
@@ -508,9 +510,9 @@ contains
     type(timedelta), pointer             :: td_tmp
     INTEGER                              :: errno
     td_tmp => newtimedelta(this%td, errno)
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     CALL timedeltatostring(td_tmp, t_timedelta_to_string, errno)    
-    CALL handle_errno(errno, __FILE__//"__LINE__")
+    CALL handle_errno(errno, __FILE__, __LINE__)
     call deallocatetimedelta(td_tmp)
   end function t_timedelta_to_string