422 bytes with ES7 by changing Math.pow(2,2) to 2**2
422 bytes with ES7 by changing Math.pow(2,2) to 2**2
JavaScript (ES6), 427430 bytes
e=m=>{throw alert(m)};u=prompt();u?alert(eval('u.match(/\d+|[^\\d+|[^,]/g).map(o=>s.push(t=o=="/"?(b=p(a=2))?a/b:e`DivisionByZero43*"?2*23-"?2-23+"?2+23%"?2%23^"?Math.pow(2,2)3D"?s.push(r=2)&&r3!"?eval("for(r=i=2;i<0?e`Negative54:i%1?e`Floating54:--i;)r*=i;r"):+o)&&t==Infinity&&e`NumberOverflow4,s=[],p=_=>s.length?s.pop():e`StackUnderflow4);t'.replace(/2[2-55]/g,x=>[,,'p()',':o=="','Exception!!!`','Factorial'][x]))):e`EmptyProgram!!!` JavaScript (ES6), 427 bytes
e=m=>{throw alert(m)};u=prompt();u?alert(eval('u.match(/\d+|[^,]/g).map(o=>s.push(t=o=="/"?(b=p(a=2))?a/b:e`DivisionByZero43*"?2*23-"?2-23+"?2+23%"?2%23^"?Math.pow(2,2)3D"?s.push(r=2)&&r3!"?eval("for(r=i=2;i<0?e`Negative54:i%1?e`Floating54:--i;)r*=i;r"):+o)&&t==Infinity&&e`NumberOverflow4,s=[],p=_=>s.length?s.pop():e`StackUnderflow4);t'.replace(/2-5/g,x=>[,,'p()',':o=="','Exception!!!`','Factorial'][x]))):e`EmptyProgram!!!` JavaScript (ES6), 430 bytes
e=m=>{throw alert(m)};u=prompt();u?alert(eval('u.match(/\\d+|[^,]/g).map(o=>s.push(t=o=="/"?(b=p(a=2))?a/b:e`DivisionByZero43*"?2*23-"?2-23+"?2+23%"?2%23^"?Math.pow(2,2)3D"?s.push(r=2)&&r3!"?eval("for(r=i=2;i<0?e`Negative54:i%1?e`Floating54:--i;)r*=i;r"):+o)&&t==Infinity&&e`NumberOverflow4,s=[],p=_=>s.length?s.pop():e`StackUnderflow4);t'.replace(/[2-5]/g,x=>[,,'p()',':o=="','Exception!!!`','Factorial'][x]))):e`EmptyProgram!!!` JavaScript (ES6), 427 bytes
e=m=>{throw alert(m)};u=prompt();u?alert(eval('u.match(/\d+|[^,]/g).map(o=>s.push(t=o=="/"?(b=p(a=2))?a/b:e`DivisionByZero43*"?2*23-"?2-23+"?2+23%"?2%23^"?Math.pow(2,2)3D"?s.push(r=2)&&r3!"?eval("for(r=i=2;i<0?e`Negative54:i%1?e`Floating54:--i;)r*=i;r"):+o)&&t==Infinity&&e`NumberOverflow4,s=[],p=_=>s.length?s.pop():e`StackUnderflow4);t'.replace(/2-5/g,x=>[,,'p()',':o=="','Exception!!!`','Factorial'][x]))):e`EmptyProgram!!!` Explanation
Uses eval to replace certain common phrases. Ungolfed and without the eval it looks like this:
e=m=>{throw alert(m)}; // e = throw error, alert displays // message, throw stops execution u=prompt(); // u = received input u?alert( // display the result u.match(/\d+|[^,]/g) // get array of numbers and operators .map(o=> // iterate over operators s.push(t= // t = last pushed value // Execute operator o=="/"?(b=p(a=p()))?a/b: // make sure argument B is not 0 e`DivisionByZeroException!!!`: o=="*"?p()*p(): o=="-"?p()-p(): o=="+"?p()+p(): o=="%"?p()%p(): o=="^"?Math.pow(p(),p()): o=="D"?s.push(r=p())&&r: o=="!"?eval(" // eval to enable for loop in ternary for( // no factorial in JS so do this manually r=i=p(); i<0?e`NegativeFactorialException!!!` // check for errors :i%1? e`FloatingFactorialException!!!` :--i; ) r*=i; r"): // return r +o // if not an operator cast as a number )&&t==Infinity&& // JS turns anything over 64 bit float e`NumberOverflowException!!!`, // max value into Infinity s=[], // s = stack array p=_=>s.length?s.pop(): // p = check stack then pop e`StackUnderflowException!!!` )&&t // return top stack element ):e`EmptyProgram!!!` // error if input length is 0