There is no way to force a caller to register the event thus if you are handling this through events, there is a chance that the consumer will ignore the issue. If it should be a blocking issue, use an exception.
From an efficiency perspective, there is an overhead to throwing (more specifically catching) exceptions, but if you're in a situation where nothing can happen it is truly an exception case. Also, consider including a Trace.Assert to assist debugging during development.