The problem is, dynamic languages make lazy programmers. They don't know or care what values a function might return. They only care about what it returns on success.
You might think that a Python library would return with an exception if it hit an error. How wrong. No, Python libraries return whatever the programmer felt like that day. If it returns a string in normal operation it might return an empty string on failure. Or False. Or None. Or a tuple of error code and description string. Or a custom Error object of some sort. Sometimes an exception. Pretty much at random, and the interpreter won't help you with a warning of any sort until an error actually happens.
This leads to the really annoying Python programs I keep running into on the Linux desktop where they work fine most of the time, but if you try to open a file on a network share and it returns some unexpected error the entire program exits with a stack trace.
Or the lovely errors and crashes the Fedora installer likes to return because it got an unexpected return value from probing LVM or RAID settings.
The VERY BEST THING for these programmers is to lock them into a C, C++ or Java straight-jacket and throw away the key. Hide the dynamic languages somewhere they can't find them. They might be allowed to use Go or Scala if they ask nicely.