2017-10-11 41 views
0

我有方法时,各方都知道,它计算三角形的角度:Testng。如何处理这个异常正确

public static double[] calculateTriangleAngles(double a, double b, double c) { 
    if (a <= 0 || b <= 0 || c <= 0 || a >= b + c || b >= a + c || c >= a + b) { 
     throw new TriangleTechnicalException("Incorrect side value"); 
    } 
    double[] angles = new double[3]; 
    angles[0] = round(Math.toDegrees(Math.acos((pow(b, 2) + pow(c, 2) - pow(a, 2))/(2 * b * c))), 2); 
    angles[1] = round(Math.toDegrees(Math.acos((pow(a, 2) + pow(c, 2) - pow(b, 2))/(2 * a * c))), 2); 
    angles[2] = round(Math.toDegrees(Math.acos((pow(a, 2) + pow(b, 2) - pow(c, 2))/(2 * a * b))), 2); 
    return angles; 
} 

计算算法是正确的。关于例外的问题。它必须扔在这里。

如何正确处理此异常(在此使用throwstry/catch或其他?)?或者更好地抛出它(但这种方法看起来不正确,在测试中包围try/catch)?

@Test 
public void testCalculateTriangleAnglesTrue() { 
    double[] expResult = {48.19, 58.41, 73.4}; 
    double[] result = new double[3]; 
    try { 
     result = TriangleFunctional.calculateTriangleAngles(7, 8, 9); 
    } catch (TriangleTechnicalException e) { 
     fail(); 
    } 
    assertTrue(Arrays.equals(expResult, result)); 
} 

你能帮我解决这个问题吗?

+1

用'throws TriangleTechnicalException'声明它。当调用该方法时,如果可以做到这一点,就用'try' /'catch' **来处理**,或者如果你不能这样做,只需在该方法中添加'TriangleTechnicalException'即可。只有当你知道如何处理它们时才捕捉异常(无论这意味着重试,记录警告,中止程序,无论如何)。 – Blorgbeard

+0

这取决于...你如何*希望*这种方法在这些条件下行为。你是否希望它抛出异常?或者是其他东西?你如何*想要消耗代码来处理它? – David

+0

@Blorgbeard,我想处理这个异常的方法有这种方法 - 'calculateTriangleAngles'。当我用'calculateTriangleAngles'方法使用'throws'时,我想这对测试这种方法来说不是很好。 在试验中'try' /'catch'是很好的做法吗? –

回答

1

您需要将throws添加到您的方法声明中。

public static double[] calculateTriangleAngles(double a, double b, double c) throws TriangleTechnicalException { 

然后,每当你使用这种方法,你需要一个try块内要么做到这一点,或有一个方法也抛出TriangleTechnicalException

+0

这是可以理解的,谢谢。但是关于测试的问题。我可以在测试中使用try/catch吗?如果不是,我怎样才能以另一种方式解决这个问题? –

+0

或者我可以通过使用'public void testCalculateTriangleAnglesTrue()throws TriangleTechnicalException'来测试它吗? –

+1

您可以在测试中使用try/catch。你有这个问题吗?我会在你的例子中的catch中放置一个fail(),因为它看起来不像应该抛出异常。如果要测试异常是否正确抛出,请在调用calculateTriangleAngles以调用无效边后发生失败。 – sn2k

1

我的建议是声明calculateTriangleAngles抛出TriangleTechnicalException,即改变第一行为

public static double[] calculateTriangleAngles(double a, double b, double c) 
    throws TriangleTechnicalException { 

这样主叫方会被告知有问题。我相信,这比处理方法中的错误,并返回某种特殊值或(更糟糕的)一个假设值来解决错误或类似错误的值更好。

如果我没有记错,如果TriangleTechnicalExceptionRuntimeException的子类,则调用者不必捕捉异常;如果发生异常,它会冒泡直到某个调用者捕获它,或者它到达顶层并且程序终止。所以测试用例不需要捕获异常。但是您肯定会想要测试错误处理代码,在这种情况下,您需要捕获异常,以验证错误处理是否按预期工作。