Ralat & Penyelesaian Pasukan Lucee MY

Ralat kompilasi CFML: enam mesej yang selalu muncul dan cara membetulkannya

Enam ralat kompilasi CFML yang kerap muncul semasa membina aplikasi: missing terminating [#], cftry tanpa penutup, cast boolean, var berganda, JAVAX dan NULL.

0
Kandungan

Ralat kompilasi CFML: enam mesej yang selalu muncul dan cara membetulkannya

Ralat kompilasi berbeza daripada ralat runtime. Halaman tidak sempat berjalan langsung, jadi tiada data untuk diperiksa dan tiada logik untuk diuji. Lucee hanya berhenti pada satu baris dan memberi mesej yang kadang-kadang menunjuk tempat yang salah.

Enam mesej di bawah ini ialah yang paling kerap muncul semasa menulis CFML. Setiap satu mempunyai punca yang tetap, dan pembetulannya pendek.

Kenapa Lucee bagi ralat missing terminating [#] for expression?

Mesej penuh:

missing terminating [#] for expression, at [15:70]
Failed at [/var/www/index.cfm:15]

Punca: satu # tunggal di dalam <cfoutput> membuka ungkapan yang tidak pernah ditutup. Kes paling biasa bukan kod CFML, tetapi warna heksadesimal dalam CSS atau penanda # dalam JSON.

<cfoutput>
<style>
body { background: #f8fafc; }
</style>
</cfoutput>

Lucee membaca #f8fafc sebagai pemboleh ubah, mencari penutup #, gagal, dan melaporkan baris itu.

Pembetulan paling bersih: letakkan blok <style> di luar <cfoutput>.

<style>
body { background: #f8fafc; }
</style>

<cfoutput>
<p>#tajuk#</p>
</cfoutput>

Kalau # itu memang perlu di dalam <cfoutput>, tulis dua kali.

<cfoutput>
<a href="##kandungan">Lompat ke kandungan</a>
</cfoutput>

Perangkap kedua yang sama bentuknya ialah JSON-LD. "@id":"https://lucee.my/glosari#terms" di dalam <cfoutput> juga mematahkan kompilasi, dan pembetulannya sama: ##terms atau letak skrip itu di luar <cfoutput>.

Kenapa Lucee kata no matching end tag for tag [cftry]?

Mesej:

No matching end tag found for tag [cftry], at [89:1]

Ia menunjuk baris PEMBUKA, bukan baris yang tertinggal. Jadi apabila anda melihat baris 89 dan baris 89 itu kelihatan betul, masalahnya ada di bawahnya: </cftry> tiada.

Corak yang selalu berlaku ialah setiap blok diakhiri dengan </cfcatch> dan orang terlupa satu baris selepasnya.

<cftry>
    <cfset hasil = enjin.jana(teks)>
<cfcatch>
    <cfset ralat = cfcatch.message>
</cfcatch>
</cftry>

Cara pantas mengesahkan: kira pasangan tag dalam fail.

grep -c "<cftry>" fail.cfm
grep -c "</cftry>" fail.cfm

Dua angka itu mesti sama. Kalau tidak, jangan cari kesalahan sintaks di tempat lain.

Kenapa muncul can't cast String [] to a boolean?

Mesej:

Can't cast String [] to a boolean

Puncanya satu pemboleh ubah yang bermula sebagai rentetan kosong, kemudian diuji sebagai boolean.

<cfset ralat = "">
<cfif NOT ralat>

Dalam CFML, rentetan kosong bukan boolean. Ia bukan false, ia hanya nilai yang tidak boleh ditukar.

Pembetulan: uji panjang, bukan nilai.

<cfset ralat = "">
<cfif NOT len(ralat)>
    <p>Tiada ralat.</p>
</cfif>

Kesilapan yang sama muncul pada nilai url.* dan form.* yang tidak diisi. Setiap kali anda menulis <!--- kalau kosong --->, tanya sama ada nilai itu rentetan atau boolean.

Kenapa ralat missing [;] selepas expression dalam cfscript?

Mesej:

Missing [;] or [line feed] after expression, at [99:35]

Baris itu kelihatan betul kerana ia betul dalam JavaScript. Dalam CFML, satu var hanya boleh mengisytiharkan satu pemboleh ubah.

var px = x * skala, py = y * skala;

Pembetulan: satu baris untuk satu pemboleh ubah.

var px = x * skala;
var py = y * skala;

Ini mudah dikenali apabila anda datang daripada JavaScript atau PHP, kerana tabiat menulis dua pemboleh ubah dalam satu baris sukar dibuang.

Kenapa variable [JAVAX] doesn't exist?

Mesej:

variable [JAVAX] doesn't exist

Ia berlaku apabila anda memanggil kelas Java dengan nama penuh tanpa createObject.

javax.imageio.ImageIO.write(imej, "png", fail);

CFML menyangka javax ialah pemboleh ubah dalam skop, bukan pakej Java, jadi ia mencari pemboleh ubah itu dahulu dan gagal.

Pembetulan: setiap kelas Java mesti melalui createObject.

<cfset createObject("java", "javax.imageio.ImageIO").write(
    imej, "png", createObject("java", "java.io.File").init(laluan))>

Peraturan yang sama terpakai pada com.google.zxing.*, java.awt.* dan mana-mana pakej lain.

Kenapa variable [NULL] doesn't exist?

Mesej:

variable [NULL] doesn't exist

null ialah kata kunci dalam CFML, jadi ia tidak boleh dihantar sebagai nilai biasa. Ini muncul apabila memanggil method Java yang menerima ImageObserver atau objek yang boleh kosong.

g.drawImage(logo, x, y, saiz, saiz, warna, null);

Pembetulan: hantar null Java melalui javacast.

<cfset g.drawImage(logo, x, y, saiz, saiz,
    createObject("java", "java.awt.Color").WHITE, javacast("null", ""))>

Corak yang sama di sebalik enam ralat ini

Empat daripada enam ralat ini berlaku kerana CFML membaca teks yang kita sangka data. # dalam CSS, # dalam JSON, null dalam panggilan Java, dan rentetan kosong dalam syarat semuanya ialah teks yang tiba-tiba ditafsir sebagai kod.

Dua lagi ialah perbezaan tabiat: CFML tidak membenarkan dua var dalam satu baris, dan setiap tag mesti ditutup walaupun editor tidak menunjukkannya.

Apabila anda terserempak ralat kompilasi yang tidak masuk akal, periksa empat perkara ini dahulu sebelum mengubah logik: bilangan #, pasangan tag, jenis nilai dalam syarat, dan sama ada kelas Java dipanggil melalui createObject.

Ralat kompilasi berhenti sebelum kod berjalan. Kalau halaman sempat terbuka dan kemudian gagal, itu kelas yang berbeza dan punca biasanya datasource, kebenaran fail, atau sambungan pangkalan data.

Cara membaca mesej ralat Lucee

Lucee memberi tiga baris yang berguna, dan satu baris yang selalu diabaikan.

Baris pertama ialah mesej. Ia menyebut apa yang salah dalam bahasa enjin, bukan bahasa manusia: missing terminating [#], no matching end tag, can't cast. Baca perkataan pertama kerana ia menentukan kelas ralat.

Baris kedua ialah lokasi, dalam bentuk [baris:lajur]. Untuk ralat yang berkaitan teks, lajur itu menunjuk tempat enjin mula membaca, bukan tempat ia berhenti. Sebab itu ralat [#] sering menunjuk lajur 70 pada baris yang kelihatan bersih.

Baris ketiga ialah laluan fail. Dalam aplikasi yang memakai laluan maya seperti /app/views/..., laluan ini memberitahu fail mana yang benar-benar disusun, dan itu penting apabila dua fail mempunyai nama yang sama dalam folder berbeza.

Baris keempat, yang selalu diabaikan, ialah Failed at yang berulang untuk setiap lapisan. Kalau senarai itu menyebut fail yang anda tidak pernah sunting, ralat itu datang daripada fail lain yang memanggilnya, dan membetulkan fail yang disebut terakhir tidak akan mengubah apa-apa.

Jadual ringkas untuk enam mesej dalam artikel ini:

MesejPuncaPembetulan
missing terminating [#]# tunggal dalam <cfoutput>## atau pindahkan blok keluar
no matching end tag [cftry]</cftry> tertinggalKira pasangan tag
can't cast String [] to a booleanRentetan kosong diuji sebagai booleanNOT len(x)
missing [;] after expressionDua var dalam satu barisSatu baris satu var
variable [JAVAX] doesn't existKelas Java tanpa createObjectcreateObject("java", ...)
variable [NULL] doesn't existnull sebagai nilaijavacast("null", "")

Simpan jadual ini berhampiran editor. Enam mesej ini meliputi sebahagian besar ralat kompilasi yang berlaku semasa membina aplikasi CFML biasa, dan setiap satu boleh dikenali dalam beberapa saat apabila anda sudah melihatnya sekali.

Soalan Lazim

Kenapa ralat menunjuk baris yang betul-betul betul? Kerana Lucee melaporkan tempat ia mula membaca ungkapan, bukan tempat ia berhenti. Untuk [#] dan tag yang tidak ditutup, kesalahan sebenar biasanya beberapa baris di bawah.

Boleh saya matikan semakan ketat semasa membangun? Tidak untuk ralat kompilasi. Ralat itu berhenti sebelum kod berjalan, jadi tiada tetapan yang boleh melangkaunya.

Adakah ralat ini sama dalam Adobe ColdFusion? Mesejnya berbeza, tetapi punca dan pembetulannya sama. ## dalam <cfoutput> dan javacast("null","") berfungsi dalam kedua-duanya.

Kenapa ia hanya berlaku pada satu halaman? Kerana # dan null hanya menjadi masalah apabila ia muncul di dalam <cfoutput> atau panggilan Java. Halaman lain mungkin tidak mempunyai corak itu.

Bagaimana mengelak daripada berulang? Simpan templat halaman tanpa <cfoutput> besar. Balut hanya bahagian yang benar-benar mempunyai pemboleh ubah, dan letakkan CSS serta JSON-LD di luar kawasan itu.

Sumber

0 komen

0 komen

Log masuk untuk menjawab atau memberi komen.

Log masuk