Well clearly, the matrix manipulation class should provide clear error messages, throwing exceptions when you try to do impossible things. What do you expect integers to do when you divide by zero? Would you rather report an array out of bounds exception or have a clearer exception that explains that the matrices are of the wrong dimensions?
So the matrix class should throw the exception, and either the user interface should avoid adding mismatched matrices in the first place, or, if you like, catch the matrix class's exception and report the error. You'd probably want a special subclass of InvalidOperationException that users of the matrix can catch to handle errors with their matrices, rather than an internal error in the program.
Regarding cars and garages -- well, who has what responsibility depends on how you're representing the physical universe.