I knew that exceptions are bad because I had many crashes in Java and Python because of uncatched exception.
But I was told Nim's exceptions don't have that problem. Can you forget or get too lazy to catch all exceptions and make a Nim program crash? How does Nim prevent this?
The central issue of all programming languages is control flow, if your program gets into an unrecoverable state: It crashes, doesn't matter how you got there. Exception handling which I think is what you're really referring to, tries to alleviate getting into these possible states.
I think it would probably help you if you wrote some programs, observed, and asked targeted questions more relating to the semantics of the implementations. When and why exceptions become an interesting issue is hardly noticed in simple scripts(note how you may read from a file without explicitly closing it again in nim) and the more of a software product you build the more clear it is why it is a useful way to think about states your program might find itself in. So it is not a problem in itself.
I realize this doesn't particularly anwser your question but could help you take the perspective neccesary to start learning from the resources already available in the manual and third party libraries. Or fall in love with monoidal composition, that seems to work for some people.
(I'm sorry if this comes off as coarse, in that case you're welcome to ask chatGPT to lighten up the prose)
Like in Java exceptions are checked in Nim and unlike in Java it's easy to ignore exceptions. To be forced to handle them use the .raises: [] construct:
import std / os
proc main() {.raises: [].} =
# does not compile
copyFile("src.txt", "dest.txt")
Effects like .raises are inferred and effectsOf allows for effect polymorphism.
For a pragmatic introduction to how to deal with exceptions in applications that shouldn't crash, we have a chapter on describing their safe use and some of their pitfalls here: https://status-im.github.io/nim-style-guide/errors.exceptions.html
Notably though, for scripts and other simple applications that you can restart easily and where all you want to do is to report the error (as opposed to handling errors and writing logic that recovers from an exception), crashes are "fine" and exceptions are an easy way to get started, specially if you're both the developer and the only user of the application you're writing.