Puh, da ist einiges falsch.
Das Create gehört
vor den try.
Dass das obige "sl1.Free;" funktioniert, liegt vielleicht nur daran, dass bei TStringList zufällig nichts schlimmes passiert.
Free ruft Destroy() auf und wenn dort auf Felder zugegriffen wird, dann gibt es zwangsläufig eine Schutzverletzung.
Wenn bei obigem "// beliebiger code hier" eine
Exception passiert, dann bleibt sl1 nil
"Dass die Methode Free auf nil prüft" ist auch falsch. FreeAndNil prüft dagegen.