I mean, it's the same type instability that you get if you try things like .5//2. Many Julia function work with ints that give a float, but not all do. If any function doesn't work (like convert will always fail if you somehow got a float but initialized an array to be similar(arrInt)), then you get this error.
This can be probably be masked a little by pre-processing. I know that ODE.jl makes the types compatible to start, but that doesn't mean they will be after one step. For example, run an Euler step with try-catch and then have it up the types to whatever is compatible, then solve the ODE. And this has almost no performance penalty in most cases (and would be easy to switch off). But I don't know if this goes into a low level "this uses this method to solve the ODE" that ODE.jl implements. But even if you do this, you won't catch all of the type errors. For example, if you want to use Rational{Int}, it can take quite a few steps to overflow the numerator or denominator, but once it does, you get an InexactError (and the solution is to use Rational{BigInt}).
You can use some try-catch phrases in the main solver, or put the solver in a try-catch and have it fix types and re-run, but these are all things that would be non-intuitive behavior and would have to be off by default. But at that point, the user would probably know to just fix the type problem.
So honestly I don't think that there's a good way to make this "silent". But this is the fundamental trade off in Julia that makes it fast, and it's not something that is just encountered here, so users will need to learn about it pretty quick or else they will see lots of other functions/packages break.