Omaduste vigade leidmine

22.05.2007  |  Gunnar

Et leida objektide omaduste kutsumisel tekkivaid vigu, sai selleks kunagi kirjutatud üks lihtne meetod ühele objektide analüüsimise klassile. Kindlasti võib seda vaja minna teistelgi, eriti neil, kes maadlevad oma algusaegadel kirjutatud objektidega.

Klassile on defineeritud staatiline meetod CheckProperties, mis võtab argumendina kaasa uuritava objekti. Kui objekt on null, siis tagastatakse tühi ArrayList. Kui objekt ei ole null, siis käiakse läbi objekti omaduste kollektsioon ning küsitakse iga leitud omaduse väärtus. Vea tekkimise korral lisatakse tekkinud viga tagastatavasse ArrayListi.

/// <summary>
/// Objektide analüüsija.
/// </summary>
public class ObjectAnalyzer
{
    /// <summary>
    /// Tuvastab omaduste lugemisel tekkivad vead.
    /// </summary>
    /// <param name="o">Uuritav objekt.</param>
    /// <returns>Tagastab ArrayList veaobjektidega.</returns>
    public static ArrayList CheckProperties(object o)
    {
        if (o == null)
            return new ArrayList();

        ArrayList errorList = new ArrayList();
        Type objectType = o.GetType();
        PropertyInfo[] propInfos = objectType.GetProperties();

        foreach (PropertyInfo propInfo in propInfos)
        {
            ParameterInfo[] paramInfos = propInfo.GetIndexParameters();
            if(paramInfos.Length == 0)
                try
                {
                    propInfo.GetValue(o, null);
                }
                catch (Exception ex)
                {
                    Exception ex2 = new Exception(propInfo.Name,
                                                   ex.InnerException);
                    errorList.Add(ex2);
                }
        }
        return errorList;
    }
}

Tähelepanu tasub juhtida veaobjekti loomisele. Me loome uue veaobjekti, millele anname teatena kaasa omaduse nime, mille küsimisel viga tekkis. Sisemiseks veaks määrame kinni püütud vea sisemise vea. Seda sellel kaalutlusel, et põhiviga käib GetValue, seega reflectioni teegis, tekkinud vea kohta. Selle vea sees on kaasas objekti vastava omaduse getteri tekitatud viga.

Alltoodud näide illustreerib klassi kasutamist objekti uurimisel.

protected void AnalyzePerson()
{
    Person person = new Person();
    Response.Write("<pre>");
    foreach (Exception ex in ObjectAnalyzer.CheckProperties(person))
    {
        Response.Write(ex.Message + "\r\n");
        Response.Write(ex.ToString() + "\r\n\r\n");
    }
    Response.Write("</pre>");
}

Olgu siinkohal veel nii palju öeldud, et ühiktestide abil tulevad sellised vead välja testimise käigus. See koodi on mõeldud rohkem nende projektide jaoks, kus ühikteste ei kasutata ja kus on tekkinud probleeme omaduste väärtuste küsimisel.

Kommenteeri

sulge
Saada link e-postiga

© DT 2012 | Creative Commons Attribution-Noncommercial 3.0 License | WordPress