Einfangen describes a physical activity, like catching a fish, thief, animal etc. Its focus is, in the literal sense, on hindering the target's free movement, and it holds the connotation of doing no harm to the target (you would never use einfangen for shooting a running thief). Now as you noticed, it is also metaphorically used is some places, like for catching a cold (Erkältung, nicht kalte). The literal meaning still has some sense as you use it here to describe that some contagious illness has been stuck with you. And you cannot use einfangen with a bus because it moves on after you got in.
Now, erwischen has a broader range of meaning and no necessary physical component. A typical meaning could be described as getting to know something someone was hiding from you. That includes noticing a thief without getting a hold of them or catching a partner cheating, where in both instances you would not use einfangen because there is no physical action linked to the situation. However, erwischen sometimes is used with included meaning of a physical action, for example with the bus. So to get the more general meaning, think of it as some sort of collision (in the broader sense) which usually is intended by the subject, while the target actively tries to avoid it. The thief tries not to be noticed, but nonetheless, someone sees them – so he is erwischt and the collision would be between the action of the thief and the other one's attention.
To get to the bus example, I think the most probable explanation comes from the children's game tag, which is also a usual situation where you would use erwischen when a collision which is trying to be avoided by the target happens. Now when running for the bus, you typically have the idea of the bus trying to get away from you, hence you use erwischen. If you use it, the connotation usually is that you barely catched the bus.
Note that erwischen is a more colloquial term than einfangen.