Use ItemUpdating event and then afterproperties contains changed value and ListItem contains original value of a field.
Here you can find info what properties are avaialable in each events.
It is also important how do you edit the list item. If via SharePoint default edit form all columns are present in afterproperties collection, but if you edit an item from custom code (e.g. webpart, event receive) only updated columns are present in that collection.
Edit: For good looking errors you can redirect user to custom error page (which you have to create)
properties.Cancel = true;
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = "/_layouts/MySolution/CustomErrorPage.aspx?Error=" + errorMessage;