You're calling the printStackTrace() that is inherited from Exception (which is probably the one it inherited from Throwable). That method doesn't know anything about your BaseException's errorMsg field. It get its message from the String argument passed to it's constructor. But since you didn't explicitly call super(String), the compiler inserted a call to super(), which means it has no message.
You need to call super(msg) in BaseException. And you could get rid of the errorMsg completely, since it's pointless.
Defining your own exception classes definitely makes sense. Typically, you'd override all 4 constructors, so that the thrower can provide any combination of message, cause, both, or neither as appropriate to the situation.