看起来你在这里有一个不好的做法,但不是你想象的地方。
抓住一个用更清晰的信息重新抛出另一个可能看起来是一个好主意,但事实并非如此。因为这意味着您关心异常中的消息。IllegalArgumentException
RuntimeException
如果您关心异常中的消息,则意味着您的用户以某种方式看到了您的异常。这很糟糕。
如果要向用户提供显式错误消息,则应在分析用户输入时检查枚举值的有效性,并在用户输入不正确时在响应中发送相应的错误消息。
像这样:
// This code uses pure fantasy, you are warned!
class MyApi
{
// Return the 24-hour from a 12-hour and AM/PM
void getHour24(Request request, Response response)
{
// validate user input
int nTime12 = 1;
try
{
nTime12 = Integer.parseInt(request.getParam("hour12"));
if( nTime12 <= 0 || nTime12 > 12 )
{
throw new NumberFormatException();
}
}
catch( NumberFormatException e )
{
response.setCode(400); // Bad request
response.setContent("time12 must be an integer between 1 and 12");
return;
}
AMPM pm = null;
try
{
pm = AMPM.lookup(request.getParam("pm"));
}
catch( IllegalArgumentException e )
{
response.setCode(400); // Bad request
response.setContent("pm must be one of " + AMPM.values());
return;
}
response.setCode(200);
switch( pm )
{
case AM:
response.setContent(nTime12);
break;
case PM:
response.setContent(nTime12 + 12);
break;
}
return;
}
}