Correct using of try/catch clause on database execution When a statement to a DB returns null, I am catching it this way:

private int GetLastRoundNumber(int period)
{
    int id;
    try
    {
        using (NpgsqlConnection con = new NpgsqlConnection(_entwConnection))
        {
            con.Open();
            using (NpgsqlCommand cmd = new NpgsqlCommand())
            {
                cmd.Connection = con;
                cmd.CommandText = "SELECT roundNumberId FROM race.folders WHERE period = @period ORDER BY roundNumberId DESC LIMIT 1;";
                cmd.Parameters.AddWithValue("period", period);
                return id = (int)cmd.ExecuteScalar();
            }
        }
    }
    catch (NullReferenceException e)
    {
        Debug.Write(e.Message);
        Debug.WriteLine("Because of a new period, started with 1 again. Period: " + period + ".");
        return id = 1;
    }
}


So to this codepart my questions:


Is it okay to have the try/catch block outside the using statement
block?
Is there a better way to handle the exception?
Do I need to hit the catch block?


I am asking because as I learned it by now, for me it isn't a real exception, because when a new period starts, there is no Id inside.

Is this the correct way to deal with it?
Some quick remarks:


Avoid writing ADO.NET code by hand; instead use an ORM like Dapper.
Why not use MAX() -- which I think is supported by PostgreSQL -- instead of ORDER BY roundNumberId DESC LIMIT 1?


SELECT MAX(column_name)  
FROM table_name  
WHERE condition;  


Don't put business logic in exceptions. Instead, make this method int?
TryGetRoundNumberId() and let the calling code solve the issue when a null is returned. 

Or perhaps provide a default, e.g. int TryGetRoundNumberId(int defaultValue), so you'll get something along these lines:

using (var sqlConnection = new SqlConnection(_connectionString))
{
    sqlConnection.Open();

    using (var sqlCommand = new SqlCommand())
    {
        // snip parameters etc.

        var result = (int?)sqlCommand.ExecuteScalar();
        if (result.HasValue)
        {
            return result.Value;
        }
        else
        {
            return defaultValue;
        }
    }
}