I followed the JSON-RPC-2.0 spec for errors, as described here:
http://groups.google.com/group/json-rpc/web/json-rpc-2-0?pli=1(see section 5.1)
... with several bitcoin-specific additional error codes that I'd have to look at the source code to remember.
I thought I'd documented the additional bitcoin error codes, but maybe that information got lost in the wiki move that happened last year or maybe I'm mis-remembering. Quick grep through rpc.cpp gives:
(-10, "Bitcoin is downloading blocks...");
(-11, "Invalid account name");
(-12, "Error: Keypool ran out, please call keypoolrefill first");
(-12, "Error: Keypool ran out, please call topupkeypool first");
(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
(-14, "Error: The wallet passphrase entered was incorrect.");
(-15, "Error: running with an encrypted wallet, but encryptwallet was called.");
(-15, "Error: running with an unencrypted wallet, but walletlock was called.");
(-15, "Error: running with an unencrypted wallet, but walletpassphrase was called.");
(-15, "Error: running with an unencrypted wallet, but walletpassphrasechange was called.");
(-16, "Error: Failed to encrypt the wallet.");
(-17, "Error: Wallet is already unlocked.");
(-2, string("Safe mode: ") + strWarning);
(-3, "Invalid amount");
(-32600, "Method must be a string");
(-32600, "Missing method");
(-32600, "Params must be an array");
(-32601, "Method not found");
(-32700, "Parse error");
(-4, "Error refreshing keypool.");
(-4, "Transaction commit failed");
(-4, "Transaction creation failed");
(-5, "Invalid bitcoin address");
(-5, "Invalid or non-wallet transaction id");
(-5, string("Invalid bitcoin address:")+s.name_);
(-6, "Account has insufficient funds");
(-6, "Insufficient funds");
(-7, "Out of memory");
(-8, "Invalid parameter");
(-8, string("Invalid parameter, duplicated address: ")+s.name_);
(-9, "Bitcoin is not connected!");