How to get around "The field is not nullable" error?

I have a shapefile of lines. I want the angle of every line calculated in a field.

I am using the script below in arcmap, but when it encounters a line that is horizontal, it stops calculating any remaining values and gives the following error:

The field is not nullable.

I searched for answers to similar questions, not getting too far with them.

Where I originally found this code: https://geonet.esri.com/thread/20473#21719

Pre-logic Script code:

``````import math
def GetAzimuthPolyline(shape):
radian = math.atan((shape.lastpoint.x - shape.firstpoint.x)/(shape.lastpoint.y - shape.firstpoint.y))
degrees = radian * 180 / math.pi
return degrees
``````

Expression:

``````GetAzimuthPolyline( !Shape!)
``````
• Is there any blank record(row) in the featureclass/shapefile? Commented Dec 10, 2015 at 6:19

To avoid a divide by zero error I would try changing:

``````import math
def GetAzimuthPolyline(shape):
radian = math.atan((shape.lastpoint.x - shape.firstpoint.x)/(shape.lastpoint.y - shape.firstpoint.y))
degrees = radian * 180 / math.pi
return degrees
``````

to:

``````import math
def GetAzimuthPolyline(shape):
if shape.lastpoint.y - shape.firstpoint.y != 0:
radian = math.atan((shape.lastpoint.x - shape.firstpoint.x)/(shape.lastpoint.y - shape.firstpoint.y))
degrees = radian * 180 / math.pi
return degrees
else:
return 90
``````

there is no "null" field with shapefile because it uses dbf table. see here

``````import math
def GetOrientation(shape):
if  (shape.lastpoint.y == shape.firstpoint.y):
degree = 90
else:
radian = math.atan((shape.lastpoint.x - shape.firstpoint.x)/(shape.lastpoint.y - shape.firstpoint.y))
degrees = radian * 180 / math.pi
return degrees
``````

This will calculate classic type direction, i.e. counterclockwise from East =positive.

``````import math
def getAngle(shp):
p1=shp.firstPoint;p2=shp.lastPoint
dX=p2.X-p1.X;dY=p2.Y-p1.Y
try:
z=math.atan(-dY/dX)
except:
z=math.pi/2
if dY>0: z=-math.pi/2
z=z*180/math.pi
if dX<0:z+=180
z=-((z+180)%360-180)
return z
``````

To call it use:

``````getAngle( !Shape! )
``````

OUTPUT:

As it is frequently the case, the idea borrowed from one of the old posts of @whuber, I struggle to locate it though.