web-dev-qa-db-fra.com

Diviser par zéro et pas d'erreur?

Je viens de lancer un test simple, pas pour une raison particulière, sinon j'aime essayer d'avoir des tests pour toutes mes méthodes, même si celle-ci est assez simple, du moins le pensais-je.

    [TestMethod]
    public void Test_GetToolRating()
    {
        var rating = GetToolRating(45.5, 0);
        Assert.IsNotNull(rating);
    }


    private static ToolRating GetToolRating(double total, int numberOf)
    {
        var ratingNumber = 0.0;

        try
        {
            var tot = total / numberOf;
            ratingNumber = Math.Round(tot, 2);
        }
        catch (Exception ex)
        {
            var errorMessage = ex.Message;
            //log error here
            //var logger = new Logger();
            //logger.Log(errorMessage);
        }


        return GetToolRatingLevel(ratingNumber);
    }

Comme vous pouvez le constater dans la méthode de test, je divise par zéro. Le problème est que cela ne génère pas d'erreur. Voir la fenêtre d'erreur ci-dessous.

Error List View from VS2017

Au lieu d’une erreur, c’est donner une valeur d’infini? Donc, j'ai googlé et trouvé que les doubles divisés par zéro NE génèrent pas d'erreur, qu'ils donnent soit nul soit l'infini. La question devient alors, comment peut-on tester une valeur de retour Infinity?

48
dinotom

Vous n'utiliserez DivideByZeroException que dans le cas où valeurs entières:

int total = 3;
int numberOf = 0;

var tot = total / numberOf; // DivideByZeroException thrown 

Si au moins un argument est un virgule flottante valeur (double dans la question), vous aurez FloatingPointType.PositiveInfinity comme résultat (double.PositiveInfinity _ dans le contexte) et sans exception

double total = 3.0;
int numberOf = 0;

var tot = total / numberOf; // tot is double, tot == double.PositiveInfinity
79
Dmitry Bychenko

Vous pouvez vérifier comme ci-dessous

double total = 10.0;
double numberOf = 0.0;
var tot = total / numberOf;

// check for IsInfinity, IsPositiveInfinity,
// IsNegativeInfinity separately and take action appropriately if need be
if (double.IsInfinity(tot) || 
    double.IsPositiveInfinity(tot) || 
    double.IsNegativeInfinity(tot))
{
    ...
}
6
Shankar