Type-based Exception Analysis for Non-strict Higher-order Functional Languages with Imprecise Exception Semantics