私はgen_server_dbと呼ぶgen_serverを書いています。 (gen_server_db:init()内の)データベースサーバを見つけようとしているときに、使用しているライブラリ(emysql)が接続に失敗する可能性があります。私は例外をキャッチし、コンソールに何かを印刷しようとすると、私はzipを取得します。以下のコードサンプルでは、io:形式のメッセージのいずれも、コンソールには到達しません。私はずっと前にこの理由を聞いているように思いますが、理由を思い出すことはできません。erlang io:フォーマット出力が失われ、復元するために何をする必要がありますか?
init(Args) ->
% I've condensed the way I actually get this stuff to one line, but if I have a
% database online I connect properly, so I know that I'm getting the Host, User, etc.
{Host, User, Password, DB, PoolSize} = application:get_env(gen_server_db, config),
init_mysql_connection(gen_server_db_pool, PoolSize, User, Password, Host, DB),
% When the net connection to the db is down, I never get here.
ok.
init_mysql_connection(bgo_db_pool, PoolSize, User, Password, Host, DB) ->
try
emysql:add_pool(bgo_db_pool, PoolSize, User, Password, Host, 3306, DB, utf8)
catch
exit:failed_to_connect_to_database ->
io:format("Cannot connect to the mysql database server. Retrying in 1 sec.~n"),
timer:sleep(1000),
init_mysql_connection(bgo_db_pool, PoolSize, User, Password, Host, DB);
Error:Reason ->
io:format("Database connection error: ~p:~p~n", [Error, Reason]),
1/0
end.
グループリーダーのリダイレクトが行われていないように見えるため、出力が表示されない可能性がある理由の1つは、実際にはそれほど大きくないことです。 init(Args)の最初のものとしてio:format()を呼び出して、initコードがまったく実行されていることを確かめてみましたか?また、gen_serverが停止したときにSASLを起動してクラッシュレポートを取得してみてください。 – RichardC