2016-08-31 46 views
5

İstisnaları test etmek için Electrons Quick Start Projekt (Comb dbef48ee7d072a38724ecfa57601e39d36e9714e) kullanıyorum.Elektronlar ana işleminde render işlemlerinin istisnalarını yakalamak mümkün mü?

index.html içinde Gerekli modülün adını renderer.js'dan rendererXXX.js'a değiştirdim.

require('./renderer.js') 
beklenen exeption sonuçlanır

(o pencere için DevTools'un görünür olan):

Şimdi
Uncaught Error: Cannot find module './rendererXXX.js' 

ana-işlem (main.js bakınız) eğer iyi olurdu farkında olduğunu bir renderer işlemi başarısız oldu. Böylece İstisna ana-işlemi iletilir değil olduğunu, ben bir try-catch-block

try { 
    app.on('ready', createWindow) 
} catch (e) { 
    console.log("Exception caught: " + e.message); 
} finally { 
    // nothing yet 
} 

içine pencerenin instatiation sarılmış Ama fark etti. Peki, işleyici süreçlerinin istisnalarını ele almanın tipik yolları nelerdir - onları ana süreçten halletmenin bir yolu var mıdır?

DÜZENLEME:

Ben de try-catch içine index.html yükleyen satırı sarılmış ama hala hatayı işleyemez:

try { 
    // and load the index.html of the app. 
    mainWindow.loadURL(`file://${__dirname}/index.html`) 
    } catch (e) { 
    console.log("Exception caught in 'createWindow': " + e.message); 
    } 
+0

deneyin işleyici işlevi. – Bergi

+0

@ Burgi: Bu da işe yaramadı - hala ana süreçte istisna göremiyorum. (Güncellenen soruma bakın) – Edward

cevap

8

Elektron pencereler kendi süreçte oluşturulur. Bundan dolayı, ana süreç ve işlem süreçleri arasında herhangi bir iletişim varsa çok az şey vardır. Yapabileceğiniz en iyi şey, render işlemindeki hataları yakalamak ve bunları, ana işleminize geri göndermek için Electrons IPC modülünü kullanmaktır. Ana süreçte

var ipc = require('electron').ipcRenderer; 
window.onerror = function(error, url, line) { 
    ipc.send('errorInWindow', error); 
}; 

: senin hale süreçte

var ipc = require('electron').ipcMain; 

ipc.on('errorInWindow', function(event, data){ 
    console.log(data) 
}); 

Ayrıca ana süreç doğrudan penceresinde olayların sınırlı sayıda izlemek (veya pencereler webContents üzerinde olabilir):

window.on('unresponsive', function() { 
    console.log('window crashed'); 
}); 

...

window.webContents.on('did-fail-load', function() { 
    console.log('window failed load'); 
}); 
+0

'ipc.send' i' 'catch ... 'yerine' window.onerror() 'a çevirmek için bir neden var mı? – Edward

+0

Well 'onerror' herhangi bir JS hatası için çalışacaktır. Ama gerekirse özel bir şeyi yakalamayı deneyebilirsiniz. – Teak

+0

'window.on (' yanıt vermiyor '... 'ana sayfaya gider? Ve IPC-mesajının hangi pencereye gönderildiğini öğrenmenin bir yolu var mı? – Edward

3

Ana işlemden bir dosyaya hataları kaydetmek istediğim benzer bir sorun yaşadım. İşte Teak:

var ipc = require('electron').ipcRenderer; 
window.onerror = function(error, url, line) { 
    ipc.send('errorInWindow', error); 
}; 

tarafından sağlanan yanıtın ekidir. Sadece onerror geri aramasının, sonuncusu gerçek Hata nesnesi olduğu 5 argümanı geçtiğini unutmayın. TMK aracılığıyla gönderirken mesajları serileştirildi beri

https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror

Ancak, varsayılan olarak doğru seri etmemesi nedeniyle tamamen Hata nesnesi geçmek mümkün değildir. Böylece, daha fazla hata detayına (yığın izleme vb.) Ihtiyacınız varsa, veriler göndermeden önce masaj yapılmalıdır.

kullandığım bazı fikirler için Is it not possible to stringify an Error using JSON.stringify? ve sonuçta aşağıdaki oldu:

main.js içinde Sonra
var objFromError = function(err, filter, space) { 
    var plainObject = {}; 
    Object.getOwnPropertyNames(err).forEach(function(key) { 
    plainObject[key] = err[key]; 
    }); 

    return plainObject; 
}; 

window.onerror = function (msg, url, lineNo, columnNo, error) { 
    ipcRenderer.send('asynchronous-windowerr', 'main', objFromError(error)); 
} 

: `createWindow` olayı içinde try-catch koymak

ipcMain.on('asynchronous-windowerr', function(event, source, err) { 
    var str = source + ': '; 

    if(err != null) { 
     if(err.stack != null) { 
      str += err.stack; 
     } else if(err.message != null) { 
      str += err.message; 
     } 
    } 

    loggerr.appendLogFile(errLogFile, 'err', str); 
})