Avatar billede lasserasch Juniormester
06. september 2009 - 17:54 Der er 3 kommentarer og
1 løsning

Object reference not set to an instance of an object.

Hejsa...

Tænkte på om nogen har en ide som kunne hjælpe mig her...

Jeg arbejder pt. med noget webkode som af tekniske årsager, som jeg ikke vil bruge tid på at forklare her, gør at jeg ikke kan debugge mig igennem min kode.

Dvs. jeg skal kode noget i VS. Compile og smide en DLL op på en server, som så eksekverer koden på et site.

Nogle gange er det vildt frustrerende blot at få beskeden "Object reference not set to an instance of an object." når man nu har f.eks. 20 objekter i en metode man kører.

Jeg ved godt man kan lægge .pdb filen op og på den måde få nogle linje numre ud osv. Men de passer aldrig med linje numrene i VS alligevel. Så det kan jeg ikke rigtig bruge til så meget...

Så jeg tænkte på om man kan extende den Exception på en eller anden måde, og få navnet på det objekt som var null udskrevet?

Pt. sidder jeg og så kode ala det her for at finde frem til det objekt som får siden til at kaste en exception. Det er total tidsspilde...

if (publikation == null)
throw new Exception("Publikation var NULL");

Håber en kan hjælpe her med en god ide....

Mvh.
Lasse
Avatar billede arne_v Ekspert
07. september 2009 - 04:06 #1
Der er ikke nogen gode løsninger.

Du bør smide exceptions fremfor returnere null i dine biblioteks rutiner.

Og du bør teste for null ved kald af eksterne biblioteks runtiner som kan returnere null.

Hvis du vil lave noget gris, så kan du weave dette ind i din kode med AspectDNG:

using System;

using DotNetGuru.AspectDNG.Joinpoints;

public class NullTester
{
    [AroundCall("* *::*(*)")]
    public static object call(JoinPoint jp)
    {
        if(jp is InstanceMethodJoinPoint)
        {
            InstanceMethodJoinPoint imjp = (InstanceMethodJoinPoint)jp;
            if(imjp.RealTarget == null)
            {
                throw new SpecialNullReferenceException("null " + imjp.TargetOperation.DeclaringType.FullName + " calling " + imjp.TargetOperation.Name);
            }
        }
        return jp.Proceed();
    }
}

public class SpecialNullReferenceException : NullReferenceException
{
    public SpecialNullReferenceException(string msg) : base(msg)
    {
    }
}
Avatar billede torbenkoch Nybegynder
07. september 2009 - 14:18 #2
Må jeg foreslå noget unit-testing af koden ;-)
Avatar billede kza Nybegynder
29. september 2009 - 17:48 #3
Hej

Det her er ikke tidsspilde, det er bare en del af opgaven:

public void Foo(Publication pub)
{
    if (pub == null) throw ArgumentNullException("pub");

    ...
}

I øvrigt har jeg aldrig haft problemer med at pdb filerne ikke giver de korrekte linienumre i stacktrace. Er du sikker på, du får bygget pdb filerne korrekt? (Du kan ikke bare tage dine pdb filer fra din Debug-build og distribuere med dine dll'er fra din Release-build.)

Klaus
Avatar billede arne_v Ekspert
14. oktober 2009 - 02:38 #4
Og et svar fra mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester