Ошибка Lua-скрипта

Ситуация:

Я хочу сохранить запись данных, которые являются значением датчика в определенном файле.

Код есть..

--Header file
require("TIMER")
require("IPBOX")
require("ANALOG_IN")
require("LOG")

function OnExit()
print("Exit code...do something")
end

function main()
timer = "Timer"
local analogsensor_1 = "AIR_1"
local analogsensor_2 = "AIR_2"
local timestr = os.data("%Y-%m-%d %H:%M:%S")


-- open the file for writing binary data
local filehandle = io.open("collection_of_data.txt", "a")


while true do 
    valueOfSensor_1 = ANALOG_IN.readAnalogIn(analogsensor_1);
    valueOfSensor_2 = ANALOG_IN.readAnalogIn(analogsensor_2);

    if (valueOfSensor_1 > 0 and valueOfSensor_2 > 0) then

        -- save values of sensors           
        filehandle:write(timestr, " -The Value of the Sensors: ", tostring(valueOfSensor_1), tostring(valueOfSensor_2)"\n");

        -- save values using rolling log appender:          
        LOG.log_event( ScenarioLoggerDevicenameInDeviceList, " -The Value of the Sensors: ", tostring(valueOfSensor_1), tostring(valueOfSensor_2), "any other string you wish to add", "etc", "etc")
        LOG.log_event( ScenarioLoggerDevicenameInDeviceList, " -The Value of the Sensors: ", tostring(valueOfSensor_1))
        print("Hello3"..valueOfSensor_1)
    end

TIMER.sleep(timer,500)
end

-- close the file
filehandle:close()

end 

print("start main")
main()

В этой строке:

filehandle:write(timestr, " -The Value of the Sensors: ", tostring(valueOfSensor_1), tostring(valueOfSensor_2)"\n");

Я получаю сообщение об ошибке:

"attemp to index global 'filehandle' (a nil value)"

Как я могу это исправить?


person jung hur    schedule 01.05.2013    source источник


Ответы (1)


io.open возвращает nil, если не может открыть файл. Это может быть связано с «файл не найден», «отказано в доступе» и, возможно, по другим причинам. Чтобы выяснить проблему, io.open имеет второе возвращаемое значение, которое позволяет вам проверить ошибку (на самом деле, она даже возвращает третье значение, которое является целым числом кода ошибки, но его значение зависит от системы).

Изменять:

local filehandle = io.open("collection_of_data.txt", "a")

to

local filehandle, message = io.open("collection_of_data.txt", "a")
if not filehandle then
    print(message)
end

Вы также можете использовать следующую идиому Lua:

local filehandle = assert(io.open("collection_of_data.txt", "a"))

Это сделает то же самое. Если первый аргумент assert равен nil, то будет напечатан второй аргумент (второе возвращаемое значение io.open. Если первый аргумент не nil, он просто будет возвращен.

person Martin Ender    schedule 01.05.2013