If you want to draw those disks and circles *automatically*, a convenient way would be post-processing a styled plot.

First we generate a unique mark for the `ExclusionsStyle` and `ClippingStyle`:

    excluColor = RGBColor @@ RandomReal[1, 3];
    clipColor = RGBColor @@ RandomReal[1, 3]

Use them to style the exclusions:

    origplot = Plot[Floor[Tan[x]], {x, 0, π},
                    PlotStyle -> Directive[Thick],
                    Exclusions -> {Automatic, Cos[x] == 0},
                    ExclusionsStyle -> {excluColor, excluColor}]

![original exclusion plot][2]

and the clipped intervals (we need this because the `ExclusionsStyle` seems to have a higher priority than `ClippingStyle`, and we don't want to mistake the clipped intervals for the discontinuous intervals):

    clipplot = Plot[Floor[Tan[x]], {x, 0, π},
                    Exclusions -> {Automatic, Cos[x] == 0},
                    ExclusionsStyle -> None,
                    ClippingStyle -> clipColor]
    
    clipIntv = Interval @@ Cases[clipplot,
                                 {___, clipColor, lines : (Line[_] ..)} :>
                                        Through[{Min, Max}@Flatten[#[[All, 1]] & @@@ {lines}]],
                                 ∞];

To draw the circles correctly, we need to know the aspect-ratio and set a appropriate radius:

    radius = 0.02;
    {rgx, rgy} = PlotRange.{-1, 1} /. AbsoluteOptions[origplot, PlotRange];
    asprat = AspectRatio /. AbsoluteOptions[origplot, AspectRatio];

The remaining work is some replacements:

    origplot /.
      {excluColor, lines : (Line[_] ..)} :>
       Flatten[{Black, Module[{x = Mean[#[[All, 1]]]},
                              If[IntervalMemberQ[clipIntv, x],
                                 {},
                                 Disk[{x, 0}, radius {1, 1/asprat rgy/rgx}]
                                ]
                              ] & @@@ {lines}}] /.
     {excluColor, Point[pts__]} :>
      Flatten[{EdgeForm[Black], FaceForm[White], Module[{pt = #},
                             If[IntervalMemberQ[clipIntv, pt[[1]]],
                                {},
                                Disk[pt, radius {1, 1/asprat rgy/rgx}]
                                ]
                            ] & /@ pts}] //
     Show[#, PlotRangeClipping -> False, PlotRangePadding -> Scaled[.05]] &

![discontinous points][3]


  [1]: https://i.sstatic.net/nSMNH.png
  [2]: https://i.sstatic.net/MdKOS.png
  [3]: https://i.sstatic.net/P2N7c.png