You can. I’d like assertions, including pre-conditions, to be considered somewhat specially in the language. First, because then it gives more structure, for instance you may identify a function’s contract mechanically (the difference is comparable to writing documentation in a free-form English comment versus structured annotations in some doc-string format). Second, because I’d like the possibility of them being erased (say, if a static analysis has found the assertions to be true statically; or, as the user of a library, I’m very self-confident and I want the raw speed of the library), and this has consequences w.r.t. semantics (side effects may or may not be performed). Also, this is a first step towards OCaml becoming the next WhyML, with a dedicated logical language.
But in the current state of the language, raising Invalid_argument is good enough!