Java mixed the two kinds of exceptions up completely and checked exceptions just added insult to that injury.
The best implementation I have seen for an imperative language is in Midori (The language used in Microsofts research OS with the same name).
http://joeduffyblog.com/2016/02/07/the-error-model/#bugs-are...
It's basically "C# done right". The blog post is well worth reading.