[thrift] improved error logging and handling for Erlang bindings

Summary:
 * custom, extensible error logger -- show only relevant stuff
 * clean up of errors in developer-supplied handler module
   now gives sane error messages and doesn't crash whole server
   (introduces tApplicationException_HANDLER_ERROR)
 * more precise catch in tErlProcessor (exits gracefully only if
   transport closes)

Reviewed By: iproctor

Test Plan: tutorial works

Revert Plan: ok


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665186 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/tutorial/erl/server.erl b/tutorial/erl/server.erl
index 0d5c1a9..2a44e1d 100644
--- a/tutorial/erl/server.erl
+++ b/tutorial/erl/server.erl
@@ -1,6 +1,7 @@
 -module(server).
 
 -include("thrift.hrl").
+-include("thrift_logger.hrl").
 -include("transport/tSocket.hrl").
 -include("protocol/tBinaryProtocol.hrl").
 
@@ -9,20 +10,22 @@
 
 -include("calculator.hrl").
 
-
 -export([start/0, start/1, stop/1, ping/0, add/2, calculate/2, getStruct/1, zip/0]).
 
+debug(Format, Data) ->
+    error_logger:info_msg(Format, Data).
+
 ping() ->
-    io:format("ping()~n",[]),
-    nil.
+    debug("ping()",[]),
+    ok.
 
 add(N1, N2) ->
-    io:format("add(~p,~p)~n",[N1,N2]),
+    debug("add(~p,~p)",[N1,N2]),
     N1+N2.
 
 calculate(Logid, Work) ->
     { Op, Num1, Num2 } = { Work#work.op, Work#work.num1, Work#work.num2 },
-    io:format("calculate(~p, {~p,~p,~p})~n", [Logid, Op, Num1, Num2]),
+    debug("calculate(~p, {~p,~p,~p})", [Logid, Op, Num1, Num2]),
     case Op of
         ?tutorial_ADD      -> Num1 + Num2;
 	?tutorial_SUBTRACT -> Num1 - Num2;
@@ -39,11 +42,12 @@
     end.
 
 getStruct(Key) ->
-    io:format("getStruct(~p)~n", [Key]),
+    debug("getStruct(~p)", [Key]),
     #sharedStruct{key=Key, value="RARG"}.
 
 zip() ->
-    io:format("zip~n").
+    debug("zip", []),
+    ok.
 
 %%
 
@@ -51,6 +55,12 @@
     start(9090).
 
 start(Port) ->
+    thrift_logger:install([#thrift_logger_state{
+       force_one_line = false,         %% should we collapse all errors to one line?
+       term_width = 110,               %% if so, crop output at this width
+       omit = [oop_new, req_processed] %% don't show these kinds of infos
+      }]),
+
     Handler   = ?MODULE,
     Processor = calculator,
 
@@ -62,9 +72,10 @@
 
     Server = oop:start_new(ServerFlavor, [Port, Handler, Processor, ServerTransport, TF, PF]),
 
-    ?R0(Server, effectful_serve),
-
-    Server.
+    case ?R0(Server, effectful_serve) of
+	ok    -> Server;
+	Error -> Error
+    end.
 
 stop(Server) ->
     ?C0(Server, stop),